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

Posted

技术标签:

【中文标题】如何为更新列的数量是动态的编写更新语句【英文标题】:How to write an update statement for which number of updated columns is dynamic 【发布时间】:2018-07-22 12:56:18 【问题描述】:

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

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

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

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

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

如果我遗漏了什么或不清楚的地方,请告诉我

【问题讨论】:

更新值从何而来?过滤条件从何而来? 请检查我的回答并接受它是否对您有帮助或为给定的解决方案提供相关反馈(cmets)。请阅读:***.com/help/someone-answers 了解为什么它很重要。 【参考方案1】:

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

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

【讨论】:

以上是关于如何为更新列的数量是动态的编写更新语句的主要内容,如果未能解决你的问题,请参考以下文章

仅包含具有更新值的列的动态更新语句

如何为子模块更新编写 git 提交消息?

Angular2:如何为多个现有数据编写更新查询

如何为 Windows 7 编写进度条以在任务栏上进行自我更新?

如何为频繁的数据库更新编写 Websockets/AJAX 代码?或者有没有更好的方法?

如何为具有不同数量的键/值对的对象添加类型? [关闭]