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

Plsql 如何编写更新列数为动态的update语句,plsql,dynamic-sql,Plsql,Dynamic Sql,我想写一个UPDATE语句,根据用户的选择,每次运行的列数可能会有所不同。 例如:DDL 一组预定义的表名和相应的列名将插入到此表中。标志的默认值设置为“N”。用户根据自己的要求将标志设置为“Y”,每次运行都会有所不同 示例数据:运行1 Table_Name Column_Name Flag T1 C1 Y T1 C2 Y T1 C3 N T2 C1 N T2 C

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

一组预定义的表名和相应的列名将插入到此表中。标志的默认值设置为“N”。用户根据自己的要求将标志设置为“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语句,该语句应该只对那些
标志设置为
Y
group by
table\u name
的列运行。根据上面给出的数据集,在
运行1
中,表
T1
的列数为
2
,而在
运行2
中,只有一列需要更新

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

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

我想这样的事情会对我有帮助

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

如果我遗漏了任何内容或不清楚,请告知我,正如APC评论的那样,您的问题是不完整的,它没有提到每个表的更新值和
where
子句的来源

如果您只是想在进行适当更改后手动生成不带where子句的update语句,那么可以使用如下简单的select查询

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;

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

更新值来自何处?过滤标准从何而来?请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解为什么它很重要。
UPDATE_QUERY                   
-------------------------------
UPDATE T1 SET C1 = :1,C2 = :2;
UPDATE T2 SET C2 = :3;