如何编写其动态更新的列数为更新的更新语句

时间:2018-07-22 12:56:19

标签: plsql dynamic-sql

我想编写一个UPDATE语句,其中根据用户的选择,每次运行的列数可能会有所不同。 例如:DDL

CREATE TABLE "XX_MASK_REF" 
   (    "TABLE_NAME" VARCHAR2(150 BYTE), 
    "COLUMN_NAME" VARCHAR2(150 BYTE), 
    "FLAG" VARCHAR2(2 CHAR) DEFAULT 'N'
   );

一组预定义的表名和相应的列名插入到该表中。 FLAG的默认值设置为“ N”。根据用户的要求,将FLAG设置为“ Y”,每次运行都会有所不同。

样本数据:运行1

Table_Name Column_Name Flag
    T1        C1    Y
    T1        C2    Y
    T1        C3    N
    T2        C1    N
    T2        C2    Y

样本数据:运行2

Table_Name Column_Name Flag
  T1           C1   Y
  T1           C2   N
  T1           C3   N
  T2           C1   N
  T2           C2   Y

我需要一条UPDATE语句,该语句仅应针对FLAGY设置为table_name组的那些列运行。根据上面给出的数据集,在Run 1中,表T1的列数为2,而在Run 2中,仅需要更新的一列。

生成的更新语句应该能够更新表中所有可用的记录,这意味着不需要where子句。

要更新的值将在变量中可用。我打算使用TRANSLATE函数,通过该函数将值传递到要更新的列。

我认为这样的事情对我有帮助

V_CHAR := 'Update' ||' ' ||V_TABLE_NAME||' ' || 'Set' ||' ' || V_COLUMN_NAME||'='||' ' || 'TRANSLATE('||V_COLUMN_NAME||', '1234567890','abcdefghijk')

如果我错过任何事情或不清楚的地方,请告诉我

1 个答案:

答案 0 :(得分:0)

如APC所评论,您的问题是不完整的,没有提到每个表的更新值和where子句来自哪里。

如果您只是在寻找生成更新语句而没有在进行适当更改后手动运行where子句的情况,则可以使用像这样的简单选择查询

SELECT
    'UPDATE '
    || table_name
    || ' SET '
    ||
        LISTAGG(column_name
                  || ' = :'
                  || ROWNUM,',') WITHIN GROUP(
            ORDER BY
                column_name
        )||';'
    AS v_upd_set
FROM
    xx_mask_ref
WHERE
    flag = 'Y'
GROUP BY
    table_name

这将显示带有绑定参数的行,以便在运行它们时传递值。

UPDATE_QUERY                   
-------------------------------
UPDATE T1 SET C1 = :1,C2 = :2;
UPDATE T2 SET C2 = :3;

如果您不需要此解决方案,请编辑问题并向我们提供更多详细信息。