17,089
社区成员
发帖
与我相关
我的任务
分享
--上面是procedure,改成function如下
CREATE OR REPLACE FUNCTION func(p1 IN VARCHAR2) RETURN SYS_REFCURSOR
is
ref_a SYS_REFCURSOR;--用这个不用另外定义动态游标类型
p_str VARCHAR2(500);
BEGIN
select con INTO p_str from c where c.id=p1;
open ref_a for 'select * from a where '||p_str;--(C表数据要没改就把这里的EXISTS去掉)
return ref_a;
end;
--调用function
DECLARE
cur SYS_REFCURSOR;
a_row a%ROWTYPE;
BEGIN
--proc('1',cur) ;--此处的1就是C表的ID
cur:=func('1');
loop
FETCH cur INTO a_row;
EXIT WHEN cur%NOTFOUND;
Dbms_Output.put_line(a_row.id||' '||a_row.a||' '||a_row.b||' '||a_row.c);
END LOOP;
END ;
--執行結果
1 a a a
2 a a b
Total execution time 0 sec.
--忘了说明一点,将C表的CON的EXISTS关键字去掉,一般这种情况只存条件就行了。
SELECT * FROM C;
C表内容如下:
ID CON
1 select 1 from b where a.a=b.a and a.id=b.id
2 select 1 from b where a.a=b.a and a.id=b.id
--创建一个PAKAGE在里面定义一个动态游标类型
CREATE OR REPLACE PACKAGE mypackage IS
TYPE refcursor IS REF CURSOR ;
END;
--创建一个返回动态游标的存储过程
create or replace PROCEDURE proc(p1 IN VARCHAR2,ref_a OUT mypackage.refcursor) is
p_str VARCHAR2(500);
BEGIN
select con INTO p_str from c where c.id=p1;
open ref_a for 'select * from a where exists('||p_str||')';
EXCEPTION WHEN OTHERS THEN
RAISE;
end proc ;
--调用存储过程,也可用JAVA程式调用,每次只将C表的ID传入即可
DECLARE
cur mypackage.refcursor;
a_row a%ROWTYPE;
BEGIN
proc('1',cur);--此处的1就是C表的ID
loop
FETCH cur INTO a_row;
EXIT WHEN cur%NOTFOUND;
Dbms_Output.put_line(a_row.id||' '||a_row.a||' '||a_row.b||' '||a_row.c);
END LOOP;
END ;
--执行结果
Line Pos Text
18 PL/SQL block, executed in 0 sec.
1 a a a
2 a a b
Total execution time 0 sec.