目标是编写一个允许我轻松记录输入参数值的方法。我知道我可以手动执行此操作,但我想知道我是否可以动态执行此操作。到目前为止,通过互联网看,似乎答案是否定的。 我目前正在使用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”。
任何帮助将不胜感激。