我需要使用sql dynamic创建一个更新,所有更新的行都必须在日志表中发送。在microsoft中,我可以使用OUTPUT子句,它将更新的行插入到表中,但在db2中,我如何使用sql dynamic做到这一点呢?
我有以下表格:
AllCustomers -包含数据库中的所有客户
| 识别码|名称名称名称|
| - -|- -|
| 一个|若翰|
| 2个|测试|
gdpr_id. -包含所有应更新的客户
| 识别码|名称名称名称|
| - -|- -|
| 一个|若翰|
gdpr_log -应包含更新语句的输出
| 识别码|名称名称名称|
| - -|- -|
| 一个|若翰|
我找到了下面的语法,但它只是显示结果。
SELECT fields FROM FINAL TABLE
(update table set field = 'value' where id ='xyz')
我尝试创建另一个动态语句
INSERT INTO
SELECT fields FROM FINAL TABLE
(update table set field = 'value' where id ='xyz')
并且语法无法识别。如何替换它以将所有更新的值插入日志表中?
我必须使用sql dynamic,因为需要更新的表存储在元数据表中,并且使用游标,我为元数据表中的每一行创建更新脚本。
UPDATE:元数据表如下所示:
| 工作台|立柱|
| - -|- -|
| 所有自定义|名称名称名称|
| 所有自定义|姓|
CREATE OR REPLACE PROCEDURE sp_test ()
DYNAMIC RESULT SETS 1
P1: BEGIN
--*****************VARIABLES*****************
DECLARE EOF INT DEFAULT 0;
declare v_table nvarchar(50);
declare v_column nvarchar(50);
declare v_rowid nvarchar(50);
declare v_stmt nvarchar(8000);
declare s1 statement;
--*****************UPDATE STEP*****************
-- Declare cursor
DECLARE cursor1 CURSOR WITH HOLD WITH RETURN FOR
SELECT table,column FROM metadata_tbl;
declare c1 cursor for s1;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET EOF = 1;
OPEN cursor1;
WHILE EOF = 0 DO
FETCH FROM cursor1 INTO v_table,v_column;
SET v_stmt = 'WITH A AS
(
SELECT name
FROM FINAL TABLE
(
UPDATE ' || v_table || ' set ' || v_column || ' = ''some name'' where id in (select ID from gdpr_id )
)
)
SELECT COUNT (1) as tst
FROM FINAL TABLE
(
INSERT INTO GDPR_LOG (table,name, LOGDATE)
SELECT ''' || v_table || ''', name, current_timestamp from A
) B';
PREPARE s1 FROM v_stmt ;
open c1 using v_table,v_column;
close c1;
END WHILE;
CLOSE cursor1;
END P1
更新步骤工作正常,插入步骤复制了插入的行。我应该做些什么才能使插入步骤正常?
1条答案
按热度按时间ne5o7dgx1#
您必须使用SELECT作为最外层语句,并将内部SELECT保存在不同的CTE中(如果有多个)。
试试看:
更新日期:
使用动态SQL。
如果使用某种工具运行此复合语句并在其中正确指定此语句终止符,则必须用不同于缺省终止符(
;
)的某个语句终止符(例如@
)将整个语句括起来。