plsql - 如何为更新列的数量是动态的编写更新语句
问题描述
我想写一个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
设置为Y
group by的列运行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')
如果我遗漏任何内容或不清楚,请告诉我
解决方案
正如 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;
如果您不想要此解决方案,请编辑您的问题并向我们提供更多详细信息。
推荐阅读
- python - 使用 numpy 时,python cairo 中的第四个数组是什么?
- node.js - mongoose Schema 中的字段可以有哪些选项?
- javascript - 在 iframe 中使用 JavaScript 删除 Cookie
- java - 如何在 Fuel Http 客户端中使用摘要认证?
- python - 如何使用 python-selenium 获取网页上视频的总时间和当前时间
- docker-compose - 如何使用 docker-compose 清除图像缓存
- mysql - 如何在MYSQL中使用sum过滤窗口函数?
- sql-server - SSIS 将 ADO Net 源聚合到 SQL Server 数据库中
- java - Java 8 DateTimeFormatter 的符号“F”
- javascript - Vue 3 Reusefull 代码如何在自定义组件中显示特定错误