设有如下过程:
CREATE OR REPLACE PROCEDURE P_TEST
(
v_cur OUT pk_sys_query.gv_sdquery_syscur,--多行记录返回
v_resultcode OUT NUMBER,
v_resulterrinfo OUT VARCHAR2
)
IS
BEGIN
v_resultcode := -1;
v_resulterrinfo := 'TradeOk';
OPEN v_cur FOR
SELECT f1,f2,f3 FROM t1 ;
v_resultcode:=0 ;
EXCEPTION
WHEN OTHERS THEN
v_resulterrinfo:='error end@ '||SQLERRM ;
v_resultcode:= -1;
END ;如何动态调用,并使用传出的游标?
CREATE OR REPLACE PROCEDURE P_TEST
(
v_cur OUT pk_sys_query.gv_sdquery_syscur,--多行记录返回
v_resultcode OUT NUMBER,
v_resulterrinfo OUT VARCHAR2
)
IS
BEGIN
v_resultcode := -1;
v_resulterrinfo := 'TradeOk';
OPEN v_cur FOR
SELECT f1,f2,f3 FROM t1 ;
v_resultcode:=0 ;
EXCEPTION
WHEN OTHERS THEN
v_resulterrinfo:='error end@ '||SQLERRM ;
v_resultcode:= -1;
END ;如何动态调用,并使用传出的游标?
已连接。SQL> var c_cur refcursor
SQL> var v_err varchar2(1000);SQL> create or replace package pkg IS
2 TYPE type_cur IS REF CURSOR;
3
4 PROCEDURE prc_getRecord(pRecord OUT type_cur, pErrText OUT VARCHAR2);
5 end pkg;
6 /程序包已创建。SQL> create or replace package body pkg IS
2 PROCEDURE prc_getRecord(pRecord OUT type_cur, pErrText OUT VARCHAR2) IS
3 BEGIN
4 OPEN pRecord FOR 'SELECT * FROM tab';
5 EXCEPTION
6 WHEN OTHERS THEN
7 pErrText:= SQLERRM;
8 END prc_getRecord;
9 end pkg;
10 /程序包主体已创建。SQL> exec pkg.prc_getRecord(:c_cur, :v_err);PL/SQL 过程已成功完成。SQL> print c_cur;TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
EMP TABLE
PLAN_TABLE TABLE
SFZ TABLE
你理解错了,我的意思是在另外一个过程中动态调用存储过程 P_TEST,并使用p_test输出的游标。
create or replace package pak
as
type refCursor is ref cursor;
end;--创建被动态调用存储过程
create or replace procedure P_TEST
(
cur out pak.refCursor
)
as
begin
open cur for select * from A;
end;
--创建调用存储过程
create or replace procedure p
as
cur pak.refCursor;
v_row A%rowtype;
begin
execute immediate 'begin P_TEST(:cur); end;' using out cur;
loop
fetch cur into v_row;
exit when cur%notfound;
dbms_output.put_line(to_char(v_row.id));
end loop;
close cur;
exception
when others then
if cur%isopen then
close cur;
end if;
dbms_output.put_line(SQLERRM);
end;--测试
begin
p;
end;
不行,总是出错
我是动态调用存储过程,包括参数,也是在调用的时候才知道的。至于作用,还是蛮大的。
谁能帮我搞搞?
不过我一执行就报连部上oracle
CREATE OR REPLACE PROCEDURE ll_03 IS
tmpVar NUMBER;
sqlpro varchar2(100);
p_cursor sys_refcursor;
v_area varchar2(20);
BEGIN
dbms_output.put_line('ll03');
tmpvar:=1;
if tmpvar=1 then
sqlpro:='begin ll_01; end;';
end if;
EXECUTE IMMEDIATE sqlpro;
tmpvar:=2;
if tmpvar=2 then
sqlpro:='begin ll_02(:1) ; end;';
end if;
dbms_output.put_line(sqlpro);
eXECUTE IMMEDIATE sqlpro using out p_cursor;
/*
loop
fetch p_cursor into v_area;
exit when p_cursor%notfound;
dbms_output.put_line (v_area) ;
end loop;
*/
END ll_03;
select * from USER_ARGUMENTS
或许对你有所帮助
不过有的版本会报ora-03113 的错误
我也就是和你报一样的错误,因此想上来问问各位大虾们有没有什么好的方法。
其实动态调用存储过的目的是为了开发即席报表,我的设想是:用户先选择查询的报表,以及查询条件,然后提交,等过一段时间,譬如一天/一个月,再登录系统进行查询,这样的目的是为了能够让用户自定义报表,还有对大数据量查询的一个后台准备。
但现在怎么试都没发弄出来,郁闷哪。 对了说一下,我是在oracle下调用的。
这样动态执行存储过程返回的游标记录集,在Oracle里面的确麻烦死了SqlServer里面倒是可以用
insert into #F
exec '存储过程名 参数1,参数2'