***Oracle存储过程是否能够直接返回游标类型?***

AllanJD 2007-02-06 12:01:58
在Informix数据库中,可以将在存储过程中查询到的多条记录以一个游标的形式返回出去,请问Oracle中有这样的功能吗?如何来做?

如果不能,那么请问Oracle存储过程如何返回多条记录?
...全文
413 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cst4023 2007-02-08
  • 打赏
  • 举报
回复

不好意思,上面一条 法1 a :中的 pkg_test.p_test(TEST,'1'); 错了

改为pkg_test.p_test(TEST);
cst4023 2007-02-08
  • 打赏
  • 举报
回复
接着我上面的帖子,这里是调用上面过程和函数的过程(其中法二有点繁,没改,你主要看下怎么调用,我加了红色,不知能显示出来否)


法1 a :

create or replace procedure test_pkg_test as
TEST pkg_test.t_ref;
L_NAME VARCHAR2(20);
BEGIN
pkg_test.p_test(TEST,'1');
LOOP
FETCH TEST INTO L_NAME;
EXIT WHEN TEST%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(L_NAME||',');
END LOOP;
END test_pkg_test;
/

法二:

CREATE OR REPLACE PROCEDURE SHOWDEPT AS
CURSOR T_ID IS SELECT DISTINCT TASK_ID FROM EMPLOYEE ORDER BY TASK_ID;
L_ID EMPLOYEE.TASK_ID%TYPE;
L_NAME VARCHAR2(30);
TO_NAMES VARCHAR2(30);
A_STEPWORKTIME NUMBER :=0;
TEST GET_EMP.EMP_NAME; --这句
BEGIN
OPEN T_ID;
<<LOOP1>>
LOOP
FETCH T_ID INTO L_ID;
EXIT WHEN T_ID%NOTFOUND;
SELECT SUM(STEPWORKTIME) INTO A_STEPWORKTIME FROM EMPLOYEE WHERE TASK_ID=L_ID;
TEST := GET_EMP.GET_EMP_NAME(L_ID); --还有这句
TO_NAMES := '';
<<LOOP2>>
LOOP
FETCH TEST INTO L_NAME;
EXIT WHEN TEST%NOTFOUND;
TO_NAMES := TO_NAMES||','||L_NAME;
END LOOP LOOP2;
INSERT INTO GET_EMPLOYEE VALUES(L_ID,TO_NAMES,A_STEPWORKTIME);
COMMIT;
END LOOP LOOP1;
CLOSE T_ID;
END SHOWDEPT;
/
cst4023 2007-02-07
  • 打赏
  • 举报
回复
我知道的有两种方法:
1、用过程实现
2、用函数实现

法1:有两种方式 a b

a、建包并在包体内的过程中实现
eg:
create or replace package pkg_test as
type t_ref is ref cursor;
procedure p_test(cur_ref out t_ref);
end pkg_test;
/

create or replace package body pkg_test as
procedure p_test(cur_ref out t_ref) is
begin
open cur_ref for select employee_name from employee;
end p_test;
end pkg_test;
/

b、不用建包,直接用一个存储过程,但要事先定义一个包“规范”(我叫它包头)
create package pack1
as
type c_u_r is ref cursor;
end;
/

create or replace procedure test_1(table_cursor out pack1.c_u_r)
AS
begin
Open table_cursor for select employee_name from employee;
end test_1;
/


法2: 这样我用过的是用建包实现(不一定!)
CREATE OR REPLACE PACKAGE GET_EMP AS
TYPE emp_name IS REF CURSOR;
FUNCTION get_emp_name(L_ID IN VARCHAR2) RETURN emp_name;
END GET_EMP;
/

CREATE OR REPLACE PACKAGE BODY GET_EMP AS
FUNCTION get_emp_name(L_ID IN VARCHAR2) RETURN emp_name
IS w_emp_name
emp_name;
BEGIN
OPEN w_emp_name FOR
SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE TASK_ID=L_ID;
RETURN w_emp_name;
END get_emp_name;
END GET_EMP;
/


上面都是我跑过通了的,法一的b改了一下,还没跑,因该没问题
调用时函数用附值,过程直接用。



vokeyliu 2007-02-07
  • 打赏
  • 举报
回复
可以通过out 参数来实现,参数的类型为 ref游标
AllanJD 2007-02-07
  • 打赏
  • 举报
回复
顶一下,有没有能给一个具体例子的呢?谢谢。
我要在一个存储过程中调用另外一个存储过程,而第二个存储过程需要返回一个游标供第一个存储过程用来循环。
siyouzi 2007-02-07
  • 打赏
  • 举报
回复
能,可以通过参数传出来
icedut 2007-02-06
  • 打赏
  • 举报
回复
--当然可以了,网上很多例子
CREATE OR REPLACE PROCEDURE ll_02 (p_cursor OUT sys_refcursor) IS
BEGIN
OPEN p_cursor FOR
SELECT * from tablename;
END ll_02;
/
doer_ljy 2007-02-06
  • 打赏
  • 举报
回复
可以返回游标类型
create procedure dp02(vCur out curtype)
wangzk0206 2007-02-06
  • 打赏
  • 举报
回复
可以呀

BAIDU上搜能够搜出一大堆 其他方法也很多 例如建个包 返回TYPE类型

很多方法

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧