用存储过程 将大段的SQL藏起来
在日常工作中,当面对比较复杂的数据库操作时不免要写一些比较长的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 * 的每列类型按序取值即可. }
先到这里吧,下篇继续.