以 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 显示两者。