Home  >  Article  >  Database  >  Oracle块编程返回结果集详解

Oracle块编程返回结果集详解

WBOY
WBOYOriginal
2016-06-07 17:33:15777browse

在Oracle块编程(begin系列)中,由于其不支持select .... from ...返回结果集的形式,因此就只能通过输出参数的形式返回结果。游

一、概述

在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      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判断时就不要重新编号了

更多详情见请继续阅读下一页的精彩内容:

相关阅读:

Oralce中返回结果集的存储过程ref cursor 

JDBC 调用Oracle存储过程返回结果集并获得输出参数

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn