我如何从plsql update语句中的变量传递列名

时间:2012-12-07 11:22:59

标签: plsql

DECLARE

  v_name  A.TRANSACTION_TYPE%TYPE   :='SALARY';
  v_salary    A.SALARY%TYPE := 1000;

BEGIN

  update A set v_name= v_salary where EMPID = 517; 
-- PL/SQL: ORA-00904: "v_name": invalid identifier
--update A set SALARY = 1000 where EMPID = 517;

END;

/

我的想法是更新表列,但这些列名存储在变量中。有没有办法从变量中传递列名?除了Execute Immediate

之外还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

不确定这是否适用于您的情况,但我written solutions我在SQL Plus中写了一个脚本并且“写了”(使用dbms_output.put_line甚至只是{{} 1}})另一个执行查询的脚本,这些查询中的列/表由SQL Plus脚本中的逻辑确定。然后我将作为脚本执行我的第一个脚本的输出,它将执行动态生成的查询,而不需要prompt

答案 1 :(得分:0)

以下想法可能适用于键入相同的多个列...如上所述,它将每次更新给定记录的所有列,但只有v_name指定的列才会更改为v_value中设置的值;其他列只是更新为其现有值。可以使用DECODENVL或其他类似的条件运算符来播放该想法。

 declare

 v_name varchar2(20):= 'SAL';
 v_value emptest.sal%TYPE := 5000;

 begin

 update emptest
 set sal = ( select case when v_name = 'SAL' then v_value else sal end from dual),
 comm = ( select case when v_name = 'COMM' then v_value else comm end from dual)
 where empno = 7369;

 commit;

 end;