如何在DB2 - IBM上的新表中插入更新的行

j0pj023g  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(219)

我需要使用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

更新步骤工作正常,插入步骤复制了插入的行。我应该做些什么才能使插入步骤正常?

ne5o7dgx

ne5o7dgx1#

您必须使用SELECT作为最外层语句,并将内部SELECT保存在不同的CTE中(如果有多个)。
试试看:

WITH A AS
(
  SELECT ID, NAME
  FROM FINAL TABLE
  (
    UPDATE GDPR
    SET NAME = 'Some name'
    WHERE ID = 1
  )
)
SELECT COUNT (1)
FROM FINAL TABLE
(
  INSERT INTO GDPR_LOG (ID, NAME)
  SELECT * FROM A
) B

更新日期:

使用动态SQL。
如果使用某种工具运行此复合语句并在其中正确指定此语句终止符,则必须用不同于缺省终止符(;)的某个语句终止符(例如@)将整个语句括起来。

BEGIN
  DECLARE C1 CURSOR FOR S1;

  PREPARE S1 FROM  
'
WITH A AS
(
  SELECT ID, NAME
  FROM FINAL TABLE
  (
    UPDATE GDPR
    SET NAME = ?
    WHERE ID = ?
  )
)
SELECT COUNT (1)
FROM FINAL TABLE
(
  INSERT INTO GDPR_LOG (ID, NAME)
  SELECT * FROM A
) B
';

  OPEN C1 USING 'Name', 1;
  CLOSE C1;

END

相关问题