从另一个PLSQL函数调用ref_游标
我有三个PLSQL函数:A、B和C 这个想法是这样的:C呼叫B,B呼叫A从另一个PLSQL函数调用ref_游标,plsql,ref-cursor,Plsql,Ref Cursor,我有三个PLSQL函数:A、B和C 这个想法是这样的:C呼叫B,B呼叫A 函数A在被B调用时,返回一个数值作为状态指示器,返回一个带有表格结果的参考光标。 例如,函数A(A1在varchar2中,A2在sys\U refcursor中)返回编号 函数B从A接收结果时,预期会在将结果传递给C之前重新格式化结果,同样以ref游标的形式 A是一个现有功能,不能修改,而B和C将是全新的功能 问题是,如何从数据库中获取ref游标?我能够获取函数(即状态指示器)返回的数值,但从A获取ref游标的结果时遇
- 函数A在被B调用时,返回一个数值作为状态指示器,返回一个带有表格结果的参考光标。 例如,函数A(A1在varchar2中,A2在sys\U refcursor中)返回编号
- 函数B从A接收结果时,预期会在将结果传递给C之前重新格式化结果,同样以ref游标的形式
如果您有任何提示,我们将不胜感激。由于您尚未向我们提供代码函数,我们将根据您的函数描述进行讨论 根据描述,您有3个功能: 函数A
create or replace function A(A1 in varchar2, A2 out sys_refcursor) return number is
begin
open A2 for select 1 from dual;
return 2;
end;
create or replace function B(B1 out sys_refcursor) return number is
cur sys_refcursor;
res_A number;
row_ your_table_a%rowtype;
begin
res_A := A('',cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row A
end loop;
open B1 for select 2 from dual;
return 1;
end;
功能B
create or replace function A(A1 in varchar2, A2 out sys_refcursor) return number is
begin
open A2 for select 1 from dual;
return 2;
end;
create or replace function B(B1 out sys_refcursor) return number is
cur sys_refcursor;
res_A number;
row_ your_table_a%rowtype;
begin
res_A := A('',cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row A
end loop;
open B1 for select 2 from dual;
return 1;
end;
功能C
create or replace function C() return number is
res_B number;
cur sys_refcursor;
row_ your_table_b%rowtype;
begin
res_B:= B(cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row B
end loop;
return 2;
end;
由于您尚未向我们提供代码函数,我们将根据您的函数描述进行讨论 根据描述,您有3个功能: 函数A
create or replace function A(A1 in varchar2, A2 out sys_refcursor) return number is
begin
open A2 for select 1 from dual;
return 2;
end;
create or replace function B(B1 out sys_refcursor) return number is
cur sys_refcursor;
res_A number;
row_ your_table_a%rowtype;
begin
res_A := A('',cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row A
end loop;
open B1 for select 2 from dual;
return 1;
end;
功能B
create or replace function A(A1 in varchar2, A2 out sys_refcursor) return number is
begin
open A2 for select 1 from dual;
return 2;
end;
create or replace function B(B1 out sys_refcursor) return number is
cur sys_refcursor;
res_A number;
row_ your_table_a%rowtype;
begin
res_A := A('',cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row A
end loop;
open B1 for select 2 from dual;
return 1;
end;
功能C
create or replace function C() return number is
res_B number;
cur sys_refcursor;
row_ your_table_b%rowtype;
begin
res_B:= B(cur);
loop
fetch cur into row_;
exit when cur%notfound;
--proccess with row B
end loop;
return 2;
end;
也许你可以试试下面的片段。试图复制您在问题中提到的场景。希望这有帮助
CREATE OR REPLACE FUNCTION A_TEST(
A1 IN VARCHAR2,
A2 OUT sys_refcursor )
RETURN NUMBER
AS
lv_num PLS_INTEGER;
BEGIN
NULL;
OPEN a2 FOR SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 19;
RETURN 1;
END;
CREATE OR REPLACE FUNCTION B_TEST
RETURN sys_refcursor
AS
lv_cur sys_refcursor;
lv_num PLS_INTEGER;
BEGIN
lv_num:=A_TEST('AV',lv_cur);
RETURN lv_cur;
END;
CREATE OR REPLACE FUNCTION C_TEST
RETURN sys_refcursor
AS
tab PLS_INTEGER;
lv_cur sys_refcursor;
BEGIN
lv_cur:=B_TEST;
LOOP
FETCH lv_cur INTO tab;
EXIT
WHEN lv_cur%NOTFOUND;
dbms_output.put_line(tab);
END LOOP;
END;
创建或替换函数A\u测试(
VARCHAR2中的A1,
A2输出系统(参考光标)
返回号码
作为
lv_num PLS_整数;
开始
无效的
打开a2从双连接中选择级别,级别<19;
返回1;
结束;
创建或替换功能B_测试
返回系统参考光标
作为
lv_cur sys_refcursor;
lv_num PLS_整数;
开始
lv_num:=A_测试('AV',lv_cur);
返回lv_cur;
结束;
创建或替换功能C_测试
返回系统参考光标
作为
tab PLS_整数;
lv_cur sys_refcursor;
开始
lv_cur:=B_试验;
环
将lv_cur提取到选项卡中;
出口
当未找到lv_cur%时;
dbms_output.put_行(tab);
端环;
结束;
也许你可以试试下面的代码片段。试图复制您在问题中提到的场景。希望这有帮助
CREATE OR REPLACE FUNCTION A_TEST(
A1 IN VARCHAR2,
A2 OUT sys_refcursor )
RETURN NUMBER
AS
lv_num PLS_INTEGER;
BEGIN
NULL;
OPEN a2 FOR SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 19;
RETURN 1;
END;
CREATE OR REPLACE FUNCTION B_TEST
RETURN sys_refcursor
AS
lv_cur sys_refcursor;
lv_num PLS_INTEGER;
BEGIN
lv_num:=A_TEST('AV',lv_cur);
RETURN lv_cur;
END;
CREATE OR REPLACE FUNCTION C_TEST
RETURN sys_refcursor
AS
tab PLS_INTEGER;
lv_cur sys_refcursor;
BEGIN
lv_cur:=B_TEST;
LOOP
FETCH lv_cur INTO tab;
EXIT
WHEN lv_cur%NOTFOUND;
dbms_output.put_line(tab);
END LOOP;
END;
创建或替换函数A\u测试(
VARCHAR2中的A1,
A2输出系统(参考光标)
返回号码
作为
lv_num PLS_整数;
开始
无效的
打开a2从双连接中选择级别,级别<19;
返回1;
结束;
创建或替换功能B_测试
返回系统参考光标
作为
lv_cur sys_refcursor;
lv_num PLS_整数;
开始
lv_num:=A_测试('AV',lv_cur);
返回lv_cur;
结束;
创建或替换功能C_测试
返回系统参考光标
作为
tab PLS_整数;
lv_cur sys_refcursor;
开始
lv_cur:=B_试验;
环
将lv_cur提取到选项卡中;
出口
当未找到lv_cur%时;
dbms_output.put_行(tab);
端环;
结束;