USING子句PLSQL中的动态参数

时间:2017-02-07 19:37:18

标签: sql oracle dynamic plsql procedure

我有一个问题,我正在构建一个PLSQL代码来执行任何过程或以动态方式运行。 我正在使用元数据表来知道我将以这种方式执行哪个元素sql。

处理一些代码以恢复信息以构建类似的块:

V_COMMAND := 'BEGIN PROC_EX(:1,:2,:3,:4); END;';

但问题在于应用命令execute immediate,因为我需要使用动态方式的子句中的绑定变量。我试图创建一个存储所有参数的String变量,但是当我执行时,我收到了一个ora错误ORA-01008

我为存储参数创建了一个临时var:

V_PARAMS := 'IN P_TABLE, IN P_WHERE, OUT O_MESSAGE, OUT O_CODE';

其中: P_TABLEP_WHEREO_MESSAGEO_CODE是在开始代码中声明的变量。

我以这种方式执行命令:

EXECUTE IMMEDIATE V_COMMAND USING V_PARAMS;

是否可以使用子句中的动态方式映射变量?

1 个答案:

答案 0 :(得分:1)

您正在寻找DBMS_SQL

符合您需求的用法示例:

CREATE OR REPLACE PROCEDURE foo (n NUMBER, square OUT NUMBER) IS
      BEGIN square := n * n; END;/

      CREATE OR REPLACE PROCEDURE bulk_plsql 
         (n DBMS_SQL.NUMBER_TABLE, square OUT DBMS_SQL.NUMBER_TABLE) IS
      c NUMBER;
      r NUMBER;
      BEGIN
        c := DBMS_SQL.OPEN_CURSOR;
        DBMS_SQL.PARSE(c, 'BEGIN foo(:bnd1, :bnd2); END;', DBMS_SQL.NATIVE);
        DBMS_SQL.BIND_ARRAY(c, 'bnd1', n);
        DBMS_SQL.BIND_ARRAY(c, 'bnd2', square);
        r := DBMS_SQL.EXECUTE(c);
        DBMS_SQL.VARIABLE_VALUE(c, 'bnd2', square);
     END;
     /