博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle返回结果集
阅读量:4958 次
发布时间:2019-06-12

本文共 2489 字,大约阅读时间需要 8 分钟。

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

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_Page12   (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 begin14 ----取记录总数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 rn25 FROM ('|| p_SqlSelect ||') A26 WHERE rownum <= '|| to_char(v_heiRownum) || '27 ) B28 WHERE rn >= ' || to_char(v_lowRownum) ;29 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn30 31 OPEN p_OutCursor FOR v_sql;32 33 end sp_Page;34 35 -------------------------------------------------------------------------------36 function fn_page37   (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 begin47   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 rn53 FROM ('|| p_SqlSelect ||') A54 WHERE rownum <= '|| to_char(v_heiRownum) || '55 ) B56 WHERE rn >= ' || to_char(v_lowRownum) ;57 --注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn58 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; 的方式。

 

转载于:https://www.cnblogs.com/yutian31/p/3978698.html

你可能感兴趣的文章
ASP.NET应用程序和ASP.NET网站所共有的文件: App_Browsers 等
查看>>
ASP.NET杂货店实战视频 VS2010+SQL2008 三层架构设计开发讲解
查看>>
样板操作数
查看>>
64位UBUNTU下安装adobe reader后无法启动
查看>>
动态缓存技术之CSI,SSI,ESI
查看>>
mac 上将.pem文件转为.pub文件
查看>>
整理下心情
查看>>
iTextSharp带中文转换出来的PDF文档显示乱码
查看>>
阶乘因式分解(一)
查看>>
qt学习记录-----3.信号与槽的问题
查看>>
『ORACLE』 内置约束(11g)
查看>>
Vue--学习过程中遇到的坑
查看>>
组件:slot插槽
查看>>
.net压缩图片质量(附demo)
查看>>
equals和==的区别
查看>>
Android6.0指纹识别开发
查看>>
java反射机制剖析(二)— Class Loader
查看>>
走进C++程序世界------异常处理
查看>>
通过用户模型,对数据库进行增删改查操作。
查看>>
去除数组中重复的元素
查看>>