如何动态调用存储过程?

How to call a stored procedure dynamically?

FOR rec IN ( SELECT Procedure_Name 
                 FROM DATAMART_PROCESS_STEPS
                 ORDER BY Procedure_Order )
LOOP
  EXECUTE rec;
END LOOP;

我有一个程序管理来自 table DATAMART_PROCESS_STEPS 的一系列程序,我需要动态地 运行 此 table 中的每个程序。 Oracle SQL 开发人员不喜欢我执行程序的方式;它抛出语法错误。完成这项任务的正确方法是什么?

EXECUTE 'BEGIN ' || rec || '; END';

在阅读了有关存储过程的教程后,我也试过这个方法,但是单引号有问题。帮助。如果您需要更多详细信息或代码,请询问。

提前致谢。

execute command 是 SQL*Plus/SQL 开发者 shorthand 匿名 PL/SQL 块。它在其他 PL/SQL 内部无效,包括在您的主程序内部。

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

本例中的动态 SQL 语句需要是围绕您的 cursor-supplied 过程名称的匿名 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;