你好,游客 登录 注册 搜索
背景:
阅读新闻

Oracle块编程返回结果集详解

[日期:2013-11-10] 来源:Linux社区  作者:yhl1994220 [字体: ]

一、概述

Oracle块编程(begin系列)中,由于其不支持select .... from ...返回结果集的形式,因此就只能通过输出参数的形式返回结果。游标作为一种将结果集封装成以指针单调向下读取数据的结构,类似于只有出队并删除操作的队列,正好作为输出参数的类型。而为了使用这种方式,必须保证存储过程的参数在声明与调用时的统一,因此不得不使用程序包。所以程序包+游标+存储过程或函数就成了块编程返回结果集的方法。下面来谈pl/sql与ODP.net实现的方法。

二、定义

1、表结构

  create table Grade
  (
      GradeId,number,
      GradeName varchar2(20)
  )

2、块编程

--定义程序包规范
create package Grades is
    type Result is ref cursor;
    procedure FenYe_Grade(p_PageSize in number,p_PageIndex in number,p_Result out Result);
end Grades;
--定义程序包体
create package body Grades is
  procedure FenYe_Grade(p_PageSize in number,p_PageIndex in number,p_Result out Result) is
  begin
      open p_Result for select GradeId,GradeName
      from (select GradeId,GradeName,rownum rn from Grade where rownum<=p_Page*p_PageSize) a
      where rn>p_PageSize*(p_Page-1);
  end FenYe_

既然谈到了rownum,那就来详细说说,rownum是读取数据时的顺序号,记得"读取数据时的顺序号",任何读取都算。就好像把所有数据放入  一个房间,门口有一个涂编号的机器(起始号为1,递增量为1),房间里出来一个,该机器就在它身上涂上一个数字,机器涂号不能被打断,一被打断,又从1开始。因为它一被打断就从1开始,所以rownum>n或rownum=n (n>1)总是为false的,根据这个比喻,用rownum>2来说:首先第一个出来为1,不满足筛选条件,抛弃掉,此时涂号器被打断,从1开始,于是第二个又是1,如此循环下去,所有的数都是1.再拿上面代码实例“where rn>p_pageSize*(p_Page-1)”来说,讨论其一种情况:

a、改为"where rownum>p_pageSize*(p_Page-1)"

这样改后,结果一定是空的,为什么呢?用rownum判断就意味着又要对a结果集重新编号了,根据上面的推论,结果一定是空的。那用rn为什么又可以呢?rn是a结果集rownum的别名,当把rownum用别名输出后,就等于rownum物化了,已经作为结果集的一列,因此用rn判断时就不要重新编号了

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2013-11/92569p2.htm

相关阅读

Oralce中返回结果集的存储过程ref cursor  http://www.linuxidc.com/Linux/2012-12/76493.htm

JDBC 调用Oracle存储过程返回结果集并获得输出参数 http://www.linuxidc.com/Linux/2011-09/42790.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款