如何动态调用存储过程?
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;
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;