Database 如何调用存储在表中的PL/SQL过程名?

Database 如何调用存储在表中的PL/SQL过程名?,database,oracle,plsql,Database,Oracle,Plsql,我在OracleDB中有一个表,其中有一个存储过程名称的字段。我的目标是创建一个带有数字参数的菜单过程。因此,当我调用它时,我希望它通过它的id(传递的编号)从这个表中获取过程名称,并调用该过程。 希望我足够清楚 p、 如果重要的话,我正在制作PL/SQL Server页面…解决方案是动态PL/SQL: procedure runproc (p_procname varchar2) is begin execute immediate 'begin ' || p_procname ||

我在OracleDB中有一个表,其中有一个存储过程名称的字段。我的目标是创建一个带有数字参数的菜单过程。因此,当我调用它时,我希望它通过它的id(传递的编号)从这个表中获取过程名称,并调用该过程。 希望我足够清楚


p、 如果重要的话,我正在制作PL/SQL Server页面…

解决方案是动态PL/SQL:

procedure runproc (p_procname varchar2) is
begin
    execute immediate 'begin ' || p_procname || '; end;';
end;

使用绑定变量作为参数。由于每个过程可能需要不同数量的参数,您可能需要使用。

在Apex已经存在多年的2011年,为什么要使用PL/SQL Server页面?嗯。。动态pl/sql。。。它与纯pl/sql不是有点不同吗?我需要安装任何东西吗?不,您只需创建PL/SQL字符串,然后使用EXECUTE IMMEDIATE或DBMS_SQL动态执行字符串。无需配置或安装。不,动态pl/sql与常规sql几乎相同。主要区别在于它不是预编译/预计算的,因此动态pl/sql的性能会比标准pl/sql差。我通常的评论是:请确保使用不能直接设置p_procname的值,只能从列表中设置。不要在POST或GET中传递它,否则您将为SQL注入攻击打开自己的大门。例如,如果他们可以用“drop table CUSTOMERS;”替换您的p_procname变量呢?感谢Jim的建议。我发布了一个要从表中选择的过程Id,所以不用担心。该表只有过程的名称,我允许匿名用户执行。