首页 > 解决方案 > 是否可以在没有动态 sql 的情况下将变量列名传递给 ORACLE 更新语句

问题描述

UPDATE P_ATTR 
    SET XC=ATTR_VAL, 
        SYS_MODIFIED_BY =UPPER(TRIM(USER_ID)), 
        SYS_MODIFIED_DATE =SYSDATE 
WHERE ID_1 IN (SELECT ID_1 
               FROM EMP_MSTR 
               WHERE UPPER(x_SQL)= UPPER(LOC) 
                AND UPPER(LOC_CD)=UPPER('IND'));

收到错误信息:

PL/SQL:ORA-00904:“XC”:无效标识符

标签: oracle

解决方案


不,没有动态 SQL 是不可能的。但是,您可以编写静态更新语句来解释变量的值并更新正确的列。像这样:

(假设“XC”是一个 PL/SQL 变量。如果您不在 PL/SQL 中,则需要一个绑定变量,因此将每次出现的“XC”替换为“:XC”。与“ATTR_VAL”处理相同。)

UPDATE P_ATTR 
  SET 
  COLUMN_1 = DECODE(XC,'COLUMN_1',ATTR_VAL,COLUMN_1), 
  COLUMN_2 = DECODE(XC,'COLUMN_2',ATTR_VAL,COLUMN_2), 
  COLUMN_3 = DECODE(XC,'COLUMN_3',ATTR_VAL,COLUMN_3), 
  COLUMN_4 = DECODE(XC,'COLUMN_4',ATTR_VAL,COLUMN_4), 
  ...
  SYS_MODIFIED_BY =UPPER(TRIM(USER_ID)), 
  SYS_MODIFIED_DATE =SYSDATE 
WHERE ID_1 IN( SELECT ID_1 
               FROM   EMP_MSTR 
               WHERE  UPPER(x_SQL)= UPPER(LOC) 
               AND    UPPER(LOC_CD)=UPPER('IND'));

推荐阅读