如何动态调用存储过程?

PZN*_*ill 2 plsql stored-procedures oracle11g oracle-sqldeveloper

FOR rec IN ( SELECT Procedure_Name 
                 FROM DATAMART_PROCESS_STEPS
                 ORDER BY Procedure_Order )
LOOP
  EXECUTE rec;
END LOOP;
Run Code Online (Sandbox Code Playgroud)

我有一个过程管理表中的一系列过程DATAMART_PROCESS_STEPS,并且我需要动态运行该表中的每个过程。Oracle SQL Developer 不喜欢我执行过程的方式;它会抛出语法错误。完成这项任务的正确方法是什么?

EXECUTE 'BEGIN ' || rec || '; END';
Run Code Online (Sandbox Code Playgroud)

在阅读有关存储过程的教程后,我也尝试过此操作,但它存在单引号问题。帮助。如果您需要更多详细信息或代码,请询问。

先感谢您。

Ale*_*ole 5

execute命令是 SQL*Plus/SQL Developer 匿名 PL/SQL 块的简写。它在其他 PL/SQL 中无效,包括在您的主过程中。

PL/SQL 中的动态调用使用不相关的execute immediate语句,并且如语法图所示,immediate 关键字不是可选的。

立即执行语法图

正如您已经意识到的那样,本例中的动态 SQL 语句需要是围绕游标提供的过程名称的匿名 PL/SQL 块。END但是你的第二个版本在你连接到字符串之后缺少一个分号;并且您直接引用rec而不是该记录类型中的列,即使用光标选择的列的名称。

所以你的循环需要做:

FOR rec IN ( SELECT Procedure_Name 
                 FROM DATAMART_PROCESS_STEPS
                 ORDER BY Procedure_Order )
LOOP
  EXECUTE IMMEDIATE 'BEGIN ' || rec.procedure_name || '; END;';
END LOOP;
Run Code Online (Sandbox Code Playgroud)