0
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;

/

我的想法是更新表列,但这些列名存储在变量中。有没有办法从变量传递列名?除了立即执行之外还有其他选择吗

4

2 回答 2

0

不确定这是否适用于您的情况,但我已经编写了解决方案,其中我在 SQL Plus 中编写了一个脚本,它“编写”(使用dbms_output.put_line甚至只是prompt)另一个执行查询的脚本,并且这些查询中的列/表是由 SQL Plus 脚本中的逻辑决定。然后我会将我的第一个脚本的输出作为脚本执行,它会执行动态生成的查询,而无需execute immediate.

于 2012-12-07T18:06:12.583 回答
0

以下想法可能适用于键入相同的多个列...正如所写,它每次都会更新给定记录的所有列,但只有 指定的列v_name将更改为中设置的值v_value;其他列只是简单地更新为其现有值。可以使用 using 或其他类似的条件运算符来实现这个DECODE想法NVL

 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;
于 2012-12-07T18:46:44.247 回答