如何从pl / sql中的过程或方法动态获取参数值?

时间:2015-08-12 04:11:32

标签: oracle plsql

目标是编写一个允许我轻松记录输入参数值的方法。我知道我可以手动执行此操作,但我想知道我是否可以动态执行此操作。到目前为止,通过互联网看,似乎答案是否定的。 我目前正在使用Oracle 12.1.0.2.0。

示例代码:

CREATE OR REPLACE PROCEDURE pr_t1( i_a VARCHAR2, i_b VARCHAR2 )
AS
   v_sql_1      VARCHAR2( 2000 );
   v_sql_2      VARCHAR2( 2000 );
   v_output_1   VARCHAR2( 2000 );
   v_output_2   VARCHAR2( 2000 );
   v_args       VARCHAR2( 2000 );
BEGIN
   SELECT    ''''''''' || '
          || LISTAGG( '''[' || a.argument_name || '='' || ' || a.argument_name || ' || '']''', ' || '', '' || ' )
                WITHIN GROUP (ORDER BY a.sequence)
          || '|| '''''''''
             AS args
     INTO v_args
     FROM user_arguments a
    WHERE a.object_name = 'PR_T1'
      AND in_out LIKE '%IN%'
      AND a.sequence = 1;

   v_sql_1 := 'BEGIN SELECT ' || '''[i_a=' || i_a || ']''' || ' INTO :p1 FROM DUAL; END;'; -- works
   DBMS_OUTPUT.put_line( 'v_sql_1: ' || v_sql_1 );

   EXECUTE IMMEDIATE v_sql_1 USING OUT v_output_1;

   DBMS_OUTPUT.put_line( 'v_output: ' || v_output_1 );

   DBMS_OUTPUT.put_line( '----------------------------------------------------' );

   DBMS_OUTPUT.put_line( 'v_args: ' || v_args );

   v_sql_2 := 'BEGIN SELECT ' || v_args || ' INTO :p1 FROM DUAL; END;';
   DBMS_OUTPUT.put_line( 'v_sql_2: ' || v_sql_2 );

   --EXECUTE IMMEDIATE v_sql_2 USING OUT v_output_2; -- How to make this work?
   DBMS_OUTPUT.put_line( 'v_output_2: ' || v_output_2 );
END pr_t1;

    -------------------------------
    -- Call the procedure
    SET SERVEROUTPUT ON;

    EXEC pr_t1('1', '2');

示例结果:

v_sql_1: BEGIN SELECT '[i_a=1]' INTO :p1 FROM DUAL; END;
v_output: [i_a=1]
----------------------------------------------------
v_args: '''' || '[I_A=' || I_A || ']'|| ''''
v_sql_2: BEGIN SELECT '''' || '[I_A=' || I_A || ']'|| '''' INTO :p1 FROM DUAL; END;
v_output_2: 

我试图找出我能做什么,以便我可以动态地使“v_sql_2”的值为“1”。

任何帮助将不胜感激。

0 个答案:

没有答案