使用EXECUTE_IMMEDIATE调用子过程

时间:2016-12-30 21:44:57

标签: oracle plsql oracle11g

我有一个函数,里面有几个子程序:

  create function func1 return varchar2
    v_string varchar2(100);
    proc1;
    proc2;
    proc3;        
  begin
    v_string := 'proc' || '1';   --- trying to make it simple
    execute immediate 'BEGIN '|| v_string ||'; END;';
    ...

直接调用子程序确实有效;但我有几十个子程序 - 所以我用' proc'形成一个字符串变量。命名并尝试在循环中动态执行它。

当我这样做时,我收到错误 - ' proc1'必须宣布。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:3)

不,你不能这样做。 proc1等本地过程超出范围,在动态SQL上下文中不可见。

您可能会使用包来实现类似的效果,但程序必须是公开的(即在包规范中声明)。

这看起来不像你应该动态做的事情。如果要确定在运行时调用哪个过程,请在每个分支中使用带有不同过程调用的case语句 - 类似the example at the end of this answer