以 sys_refcursor 作为参数动态调用一个过程
Call dynamically a procedure with sys_refcursor as parameter
为了简化问题,我排除了不相关的代码。
declare
v_sql_tx varchar2(4000);
cur sys_refcursor;
begin
v_sql_tx := 'procedure(' || cur || ')';
execute immediate v_sql_tx;
end;
这将导致错误 PLS-00306: wrong number or types of arguments in call to '||'
。
有没有办法将内插光标作为参数?
如果你没有过度简化它,那么你不需要动态 SQL。
declare
cur sys_refcursor;
begin
procedure(cur); --> presuming that "procedure" actually represents some procedure name
end;
如果您过度简化了问题并且确实有正当理由使用动态 SQL - 例如动态过程名称 - 然后您可以使用绑定变量作为参数,然后在 execute immediate
调用中绑定游标。不过,您的过程调用无论如何都需要在匿名块中:
declare
v_sql_tx varchar2(4000);
cur sys_refcursor;
begin
v_sql_tx := 'begin procedure(:cur); end;';
execute immediate v_sql_tx using cur;
end;
但如果可以,请使用静态调用,如@Littlefoot 所示。
db<>fiddle 显示两者。
为了简化问题,我排除了不相关的代码。
declare
v_sql_tx varchar2(4000);
cur sys_refcursor;
begin
v_sql_tx := 'procedure(' || cur || ')';
execute immediate v_sql_tx;
end;
这将导致错误 PLS-00306: wrong number or types of arguments in call to '||'
。
有没有办法将内插光标作为参数?
如果你没有过度简化它,那么你不需要动态 SQL。
declare
cur sys_refcursor;
begin
procedure(cur); --> presuming that "procedure" actually represents some procedure name
end;
如果您过度简化了问题并且确实有正当理由使用动态 SQL - 例如动态过程名称 - 然后您可以使用绑定变量作为参数,然后在 execute immediate
调用中绑定游标。不过,您的过程调用无论如何都需要在匿名块中:
declare
v_sql_tx varchar2(4000);
cur sys_refcursor;
begin
v_sql_tx := 'begin procedure(:cur); end;';
execute immediate v_sql_tx using cur;
end;
但如果可以,请使用静态调用,如@Littlefoot 所示。
db<>fiddle 显示两者。