在日常工作中,当面对比较复杂的数据库操作时不免要写一些比较长的SQL,由于某系SQL有些长(目前我写的最长的貌似有30多行吧),这时候长会面临这个

 
方法 优点 缺点
用"+"串起来 调调格式,可读性比较好,修改方便 字符串反复拼接,降低效率
StringBuiler 安全稳定 降低可读性

并且,较长的SQL会让一些同事看起来感到头疼,望而生畏.每当遇到问题,自己不敢调试,最后都是把问题throw 给我.

 
很久以前倒是尝试了PL/SQL,但是一直有个疑问没有解决,在工作中没有大规模使用,以目前的所学,我认为PL/SQL是ORACLE的精髓.
 
我心中的那个疑问就是: 数据库如何返回多条多列(形如java里的二维数组)的数据给java.说道本质就是在PL/SQL构造自定义类型. 这个先不说,今天主要介绍下返回游标(curosr)的方法.
 
--1.创建一个包,在该包中,我定义rst_cursor是个游标
 
create or replace package the_package_name as
type rst_cursor is ref cursor;
end the_package_name;
/
--2.创建过程
create or replace procedure the_proc(
num_param in number,
curs_param out the_package_name.rst_cursor -- 这就是上面包里定义的游标类型
)
is
begin open curs_param for select * from emp where emp.num = num_param;
--这里直接赋值,不用赋值符号( : )
--for 也可接字符串拼接的SQL,在这里拼接符为"||",类似"+";
end;
 
在java里调用
 
// 创建CallableStatement
// 由于项目持久框架用的Hibernate,所以这里的connction 我用session.getConnection()得到.
CallableStatement cs = connection.prepareCall("{the_proc(?,?)}"); // 给? 赋值
cs.setInt(1,10); //索引从1开始
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR); //这个是输出参数类型 // 执行
cs.execute(); // 得到结果
ResultSet rs = (ResultSet)cs.getObject(2); //去的游标的返回值 while(rs.next()){ System.out.println(rs.getInt(1)); //根据select * 的每列类型按序取值即可. }
 
先到这里吧,下篇继续.
 
 
 

用存储过程 将大段的SQL藏起来的更多相关文章

  1. ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK

    看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...

  2. ASP.NET MVC + EF 利用存储过程读取大数据

    ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...

  3. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL/SQL Statement ignored 问题

    前段时间由于修改SMES系统,出现了一个问题. ORA-06550:line 1,column 7;PLS-00201:indentifer '存储过程' must be declared;...PL ...

  4. MySQL 存储过程删除大表

    1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...

  5. 关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

    本文出处:http://www.cnblogs.com/wy123/p/6262800.html   在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的 ...

  6. WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗

    在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级 ...

  7. 使用<pre>标签为你的网页加入大段代码

    在上节中介绍加入一行代码的标签为<code>,但是在大多数情况下是需要加入大段代码的,如下图: 怎么办?不会是每一代码都加入一个<code>标签吧,没有这么复杂,这时候就可以使 ...

  8. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  9. 如何把大段文字转为带html标签的文字

    开发网页的时候,有时候会遇到大段的隐私声明,用户协议等等,我们呀要复制粘贴展示出来,必须加大量的p标签,h1,h2,空格符,br标签,这对我们来说无疑是泪崩的,有个很好的办法,可以快速给这些文字加标签 ...

随机推荐

  1. ASP.NET MVC 伪静态的实现

    public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.Ignore ...

  2. Linux文件系统(inode、block……)

    内容源于<鸟哥的Linux私房菜> 认识 EXT2 文件系统 文件系统的特殊观察与操作 文件系统 superblock,inode,block superblock,inode,block ...

  3. ODATA WEB API(二)----ODATA服务与客户端

    一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...

  4. python多线程之Event(事件)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import time from threading import Thread, Event import ...

  5. 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)

    算法训练 Torry的困惑(基本型) 时间限制:1.0s   内存限制:512.0MB      问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...

  6. js继承的概念

    js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js ...

  7. Linux环境下使用perl编写CGI(httpd)

    例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...

  8. UE对一个很长的字符按16位自动换行

    ① ②设定16个位 ③ ④结果

  9. 【rqnoj39】 饮食问题

    题目描述 Bessie 正在减肥,所以她规定每天不能吃超过 C (10 <= C <= 35,000)卡路里的食物.农民 John 在戏弄她,在她面前放了B (1 <= B < ...

  10. LeetCode——Rotate Image(二维数组顺时针旋转90度)

      问题: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockw ...