如何从存储过程返回多行? (Oracle PL / SQL)

我想用一个参数创建一个存储过程,该存储过程将根据参数返回不同的记录集。 这是怎么做的? 我可以从普通SQL中调用它吗?

5个解决方案

65 votes

这是如何构建一个函数,该函数返回可以像表一样查询的结果集:

SQL> create type emp_obj is object (empno number, ename varchar2(10));

2 /

Type created.

SQL> create type emp_tab is table of emp_obj;

2 /

Type created.

SQL> create or replace function all_emps return emp_tab

2 is

3 l_emp_tab emp_tab := emp_tab();

4 n integer := 0;

5 begin

6 for r in (select empno, ename from emp)

7 loop

8 l_emp_tab.extend;

9 n := n + 1;

10 l_emp_tab(n) := emp_obj(r.empno, r.ename);

11 end loop;

12 return l_emp_tab;

13 end;

14 /

Function created.

SQL> select * from table (all_emps);

EMPNO ENAME

---------- ----------

7369 SMITH

7499 ALLEN

7521 WARD

7566 JONES

7654 MARTIN

7698 BLAKE

7782 CLARK

7788 SCOTT

7839 KING

7844 TURNER

7902 FORD

7934 MILLER

Tony Andrews answered 2020-06-30T04:27:23Z

22 votes

我认为您想返回一个REFCURSOR:

create function test_cursor

return sys_refcursor

is

c_result sys_refcursor;

begin

open c_result for

select * from dual;

return c_result;

end;

更新:如果需要从SQL调用此函数,请使用建议使用的表函数,例如@Tony Andrews。

Thilo answered 2020-06-30T04:27:48Z

8 votes

您可以使用Oracle流水线函数

基本上,当您希望将PLSQL(或Java或C)例程作为“源”时 数据-而不是表-您将使用流水线函数。

简单示例-生成一些随机数据

如何根据输入参数创建N个唯一的随机数?

create type array

as table of number;

create function gen_numbers(n in number default null)

return array

PIPELINED

as

begin

for i in 1 .. nvl(n,999999999)

loop

pipe row(i);

end loop;

return;

end;

假设我们需要三行内容。 现在,我们可以通过以下两种方式之一进行操作:

select * from TABLE(gen_numbers(3));

COLUMN_VALUE

1

2

3

要么

select * from TABLE(gen_numbers)

where rownum <= 3;

COLUMN_VALUE

1

2

3

管道功能1管道功能2

Mohsen Heydari answered 2020-06-30T04:28:45Z

3 votes

如果要在普通SQL中使用它,我将让存储过程使用结果行填充表或临时表(或使用@Tony Andrews方法)。

如果要使用@Thilo的解决方案,则必须使用PL / SQL循环游标。这是一个示例:(我使用了过程而不是函数,就像@Thilo一样)

create or replace procedure myprocedure(retval in out sys_refcursor) is

begin

open retval for

select TABLE_NAME from user_tables;

end myprocedure;

declare

myrefcur sys_refcursor;

tablename user_tables.TABLE_NAME%type;

begin

myprocedure(myrefcur);

loop

fetch myrefcur into tablename;

exit when myrefcur%notfound;

dbms_output.put_line(tablename);

end loop;

close myrefcur;

end;

John Smithers answered 2020-06-30T04:29:10Z

1 votes

create procedure (p_cur out sys_refcursor) as begin open p_cur for select * from end;

S. Mayol answered 2020-06-30T04:29:26Z

oracle存储过程多分支怎样写,如何从存储过程返回多行? (Oracle PL / SQL)相关推荐

  1. oracle存储过程多分支怎样写,如何写一个分段提交的存储过程啊

    以下是我做批量删除的时候用到的几种方法,删除和UPDATE,INSERT差不多,可以依葫芦画瓢,所以我就不改了,LZ自己看看吧 create or replace procedure delete_t ...

  2. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  3. Oracle数据库学习:PL/SQL(详解)

    Oracle数据库学习:PL/SQL 什么是PL/SQL PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的扩展语言; 使用PL/SQL 可以编写具 ...

  4. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  5. oracle 的遍历语法,oracle pl/sql之pl/sql语法

    一.pl/sql基础 pl/sql分匿名块和命名块. 命名块:存储过程,函数,触发器,包等. pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块 ...

  6. oracle数据库匿名快,pl/sql分匿名块和命名块

    命名块:存储过程,函数,触发器,包等 pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块中唯一要求必须存在的部分,声明部分和异常处理部分是可选的 ...

  7. Oracle 动态游标 PL/SQL 动态SQL语句 open for [using] 语句

    PL/SQL:open for [using] 语句 2017年07月19日 09:52:55 学孩儿无牙哭做粥 阅读数:681 标签: oracleSQLPLSQL 更多 个人分类: ORACLES ...

  8. oracle返回0001错误,ORACLE 异常错误处理

    本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2 ...

  9. oracle连接长时间未响应,Oracle的pl/sql客户端请求超时未响应的解决方法及装置与流程...

    本发明涉及计算机技术领域,具体提供一种Oracle的pl/sql客户端请求超时未响应的解决方法及装置. 背景技术: 随着信息技术的发展,Oracle数据库技术越来越广泛地推广应用到各个领域.当pl/s ...

最新文章

  1. 记录一次服务进程强行退出的问题排查过程
  2. 超链接一般有两种表现形式_外链的三种常见表现形式
  3. ModelSerializer序列化(Apiview)
  4. Linux下如何阅读开源项目
  5. python爬虫 导出/乱码/中英文夹杂问题解决
  6. 游戏引擎渲染管线的总结
  7. 51Nod - 1534 棋子游戏
  8. 轻松拥有美国号码,免费收发短信
  9. 2019年香港科大EMBA校友会年度盛会在珠海圆满落幕
  10. 【matplotlib绘图】调整图片尺寸大小
  11. Problem C: 点在圆内吗?
  12. 004永磁同步电机的工作原理:大白话详细讲解从最简单的直流有刷电机到永磁同步电机是如何转动起来的
  13. Java开发必学:java核心技术电子书资源
  14. 阿里云负载均衡(SLB)简介
  15. 【干货】Excel根据条件变换颜色
  16. 阿里一二三面、HR面面经-后台
  17. Springboot进行qq邮箱验证
  18. 【Windows 问题系列第 2 篇】如何让显示的窗口在桌面的最上面,而不被其它窗口遮挡?
  19. 身份证过期了,银行卡上的身份证信息是不是都要去银行更新?
  20. Win10 UWP应用发布流程

热门文章

  1. mysql复制的工作原理及主从复制的实现
  2. 关于spring 获取不到网站上的xsd的处理记录
  3. eclipse4.3.1标准版安装freemarker插件
  4. 派生类类型可以转换为基类类型,反之则不行
  5. Eclipse常用插件下载地址
  6. leetcode 480. 滑动窗口中位数(堆+滑动窗口)
  7. 渐进式web应用程序_如何在渐进式Web应用程序中添加到主屏幕
  8. 移动应用程序和网页应用程序_如何开发感觉像本机移动应用程序的渐进式Web应用程序...
  9. tableau使用_使用Tableau升级Kaplan-Meier曲线
  10. react-native-Cocoapods-Swift-Project