oracle返回结果集

新项目启动想使用存储过程返回结果集,上家公司经常写,这才几年就忘的差不多了,费了老大劲才搞好。留个印,以备后续查看。。。

oracle 返回结果集 需要使用到包(package),结果集是作为游标类型(CURSOR)返回. 且返回的结果集不能在pl/sql中利用exec 存储

过程名() 看到结果集(模糊记得是可以但没实现,通过函数实现是看到的一个游标结果集,点击是可以看到结果集的,也许是记错了,

期待有知道的朋友解答)。

事例代码,实现分页存储过程。

fn_page 通过函数实现分页,pl/sql执行 可以看到结果集,但函数不够灵活;

sp_page 存储过程实现。

包头的定义

fn_page

 1 CREATE OR REPLACE PACKAGE pkg_test
 2 AS
 3 type refCursorType is REF CURSOR;
 4
 5 function fn_Page
 6  (p_PageSize int, --每页记录数
 7 p_PageNo int, --当前页码,从 1 开始
 8 p_SqlSelect varchar2)
 9  return refCursorType;
10
11 PROCEDURE sp_Page
12   (p_PageSize int, --每页记录数
13 p_PageNo int, --当前页码,从 1 开始
14 p_SqlSelect varchar2, --查询语句,含排序部分
15 p_OutRecordCount out int,--返回总记录数
16 p_OutCursor out refCursorType); --Package中声明名为get 的Procedure(只有接口没内容)
17
18
19 END pkg_test;

包体

 1 create or replace package body pkg_test
 2 as procedure sp_Page(p_PageSize int, --每页记录数
 3 p_PageNo int, --当前页码,从 1 开始
 4 p_SqlSelect varchar2, --查询语句,含排序部分
 5 p_OutRecordCount out int,--返回总记录数
 6 p_OutCursor out refCursorType)
 7 is
 8 v_sql varchar2(3000);
 9 v_count int;
10 v_heiRownum int;
11 v_lowRownum int;
12
13 begin
14 ----取记录总数
15 v_sql := ‘select count(*) from (‘ || p_SqlSelect || ‘)‘;
16 execute immediate v_sql into v_count;
17 p_OutRecordCount := v_count;
18 ----执行分页查询
19 v_heiRownum := p_PageNo * p_PageSize;
20 v_lowRownum := v_heiRownum - p_PageSize + 1;
21
22 v_sql := ‘SELECT *
23 FROM (
24 SELECT A.*, rownum rn
25 FROM (‘|| p_SqlSelect ||‘) A
26 WHERE rownum <= ‘|| to_char(v_heiRownum) || ‘
27 ) B
28 WHERE rn >= ‘ || to_char(v_lowRownum) ;
29 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
30
31 OPEN p_OutCursor FOR v_sql;
32
33 end sp_Page;
34
35 -------------------------------------------------------------------------------
36 function fn_page
37   (p_PageSize int, --每页记录数
38 p_PageNo int, --当前页码,从 1 开始
39 p_SqlSelect varchar2)
40 return refCursorType
41 is allinfo refCursorType;
42 v_sql varchar2(3000);
43 --v_count int;
44 v_heiRownum int;
45 v_lowRownum int;
46 begin
47   v_heiRownum := p_PageNo * p_PageSize;
48 v_lowRownum := v_heiRownum - p_PageSize + 1;
49
50 v_sql := ‘SELECT *
51 FROM (
52 SELECT A.*, rownum rn
53 FROM (‘|| p_SqlSelect ||‘) A
54 WHERE rownum <= ‘|| to_char(v_heiRownum) || ‘
55 ) B
56 WHERE rn >= ‘ || to_char(v_lowRownum) ;
57 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
58
59 OPEN allinfo FOR v_sql;
60  -- open allinfo for select id,name from test where rownum<40;
61   return allinfo;
62 end fn_page;
63 end pkg_test;

调用方式可以使用 call、exec\execute ,begin ... end; 的方式。

时间: 2024-10-11 06:47:50

oracle返回结果集的相关文章

oracle创建存储过程并返回结果集(附C#调用代码)

使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我们怎么实现跟SQL SERVER同样的功能呢?且看以下代码: create or replace procedure sp_getdept (rep_type in varchar2,sel in varchar2,result out sys_refcursor) as seq varchar2(

oracle 存储过程返回结果集

好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过程中先根据过滤条件从海量数据表中选出符合条件的记录并存放到临时中, 可以通过一个视图将临时表与其他相关表连接起来, 从而避免海量数据造成的连接效率问题. 本文只讨论使用存储过程返回结果集. 具体实现如下: -- 启用服务器输出---------------------set serveroutput

Dapper完美兼容Oracle,执行存储过程,并返回结果集。

这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合,再转json一气呵成. 不过,各种ORM总有让人吐槽的地方... 比如,我之前在SqlServer上写测试,搞封装,没有任何问题.CURD.批量操作.存储过程.事物等. 可是以转到Oracle上,就出问题了[喂~不是说好的支持Oracle的么] 在写Dapper+Oracle单元测试的前期,是没有问题的,也就是说普通的Sql操作是没有任何问题的. 然后,我写到

Oracle中函数如何返回结果集

在Oracle中,用函数返回结果集有时候要用到,下面是demo: 1 2 3 4 5 6 7 create or replace type t_test as object ( id integer, create_time date, object_name varchar2(60) ); create or replace type t_test_table as table of t_test; 1.用数组的方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Oracle 中,函数如何返回结果集

在Oracle中,用函数返回结果集有时候要用到,下面是demo: create or replace type t_test as object ( id integer, create_time date, object_name varchar2(60) ); create or replace type t_test_table as table of t_test; 1.用数组的方式 create or replace function f_test(n in number defaul

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR -- 包里面方法名 ) is str_sql varchar2(8000) := ''; begin str_sql

Java 返回结果集的存储过程

--返回结果集的存储过程 --1.创建一个包 create package myTestPackage as type test_cursor is ref cursor; end myTestPackage; --2.创建存储过程 create procedure sp_pro9( spNo in number, p_cursor out myTestPackage.test_cursor) is begin open p_cursor for select * from student wh

mybatis调用mysql存储过程返回结果集

存储过程中经常需要返回结果集. Mysql 中直接用 select 即可返回结果集.而 oracle 则需要使用游标来返回结果集.这一点 Mysql 相对比较方便,如下代码即可实现输出结果集: 存储过程定义: DELIMITER $$ DROP procedure IF EXISTS pro_sql_data1 $$ CREATE procedure pro_sql_data1(in sear_name varchar(2000)) BEGIN if sear_name is not null

JDBC连接数据库返回结果集的Key值

JDBC连接数据库查询数据时时返回ResultSet结果集.ResultSet中存放键值对.我们可以首先取得Key值,然后通过key值获取我们想要的value.那么我们如何获取Key值呢?看下面代码: try { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); rs = getStmt().executeQuery(sql); // 得到结果集ResultSet的结