在日常工作中,当面对比较复杂的数据库操作时不免要写一些比较长的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. 在帝都的Android面试感想

    #第一次面试赤子城Android开发实习生 关于面试的表现和感想 1.没有准备充分就去面试(这是大忌,也就直接决定了结果) 我去面试Android,但是却不知道很多关于Android的基础知识,就是明 ...

  2. RESTful架构入门

    理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful RESTful API 设计指南 - 阮一峰的网络日志http ...

  3. 锁ReaderWriterLockSlim介绍

    概述 ReaderWriterLockSlim 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问: 常用的方法: cacheLock.EnterReadLock();//加上读取锁 ...

  4. gcc参数-l传递顺序错误导致`undefined reference'的一点小结

    刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: $ gcc -o thread1 -lpthread th ...

  5. [LeetCode] Merge Sorted Array

    Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume tha ...

  6. jq与js 区别

    $(this).html(666); <div id="a">123</div> <script> $("#a").clic ...

  7. phpcms v9实现wap单页教程

    下面以添加“关于我们”这一单页为例作phpcms V9 wap手机门户添加单页的教程说明: 步骤一:复制phpcms\templates\default\wap下的maps.html,粘贴重命名为ab ...

  8. hdu 2232 矩阵 ***

    一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...

  9. hdu 5000 dp **

    题目中提到  It guarantees that the sum of T[i] in each test case is no more than 2000 and 1 <= T[i]. 加 ...

  10. 关于UltraISO打开iso文件后只有部分文件问题

    背景:在安装CentOS 7的时候,用UltraISO打开之后,只有一个EFI文件,刻完U盘,却无法引导. 之前还以为偶没下载全,就又下了一遍,还好偶搞得的NetInstall,要不然就呵呵了. 解决 ...