zoukankan      html  css  js  c++  java
  • 用存储过程 将大段的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 * 的每列类型按序取值即可.
     
    }
     
    先到这里吧,下篇继续.
     
     
     
  • 相关阅读:
    HTTP Header 详解
    nginx负载均衡配置
    Win10安装Oracle11g
    MySQL如何让别人远程连接自己的数据库
    Maven的安装以及配置
    linux上安装jdk,tomcat,mysql
    Centos7上安装docker
    ActiviMQ快速入门
    2018年上海后半年JAVA软件工程师面试真题
    Docker安装MySQL、Redis、Tomcat
  • 原文地址:https://www.cnblogs.com/yakun/p/3188852.html
Copyright © 2011-2022 走看看