• 用存储过程 将大段的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 * 的每列类型按序取值即可.
     
    }
     
    先到这里吧,下篇继续.
     
     
     
  • 相关阅读:
    寒假第七天
    寒假第六天
    寒假第五天
    寒假第四天
    leetcode 105 从前序与中序遍历序列构造二叉树
    leetcode 268 丢失的数字
    leetcode 141 环形链表
    判断顶点是否在三角形内部
    java 基本数据类型
    leetcode 20 有效的括号
  • 原文地址:https://www.cnblogs.com/yakun/p/3188852.html
Copyright © 2020-2023  润新知