首页 > 解决方案 > 如何为更新列的数量是动态的编写更新语句

问题描述

我想写一个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 语句,它应该只对那些FLAG设置为Ygroup by的列运行table_name。从上面给出的数据集中,在 中Run 1,表的列数T12,而在 中,Run 2它只有一列需要更新。

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

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

我认为这样的事情会帮助我

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

如果我遗漏任何内容或不清楚,请告诉我

标签: plsqldynamic-sql

解决方案


正如 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;

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


推荐阅读