首页 > 技术文章 > 用存储过程 将大段的SQL藏起来

yakun 2013-07-14 00:02 原文

在日常工作中,当面对比较复杂的数据库操作时不免要写一些比较长的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 * 的每列类型按序取值即可.
 
}

 

 
先到这里吧,下篇继续.
 
 
 

推荐阅读