DB2 / SQL:retrieve修改或插入的ID列表

DB2 / SQL:retrieve the list of IDs modified or inserted

关于 DB2 / 400 SQL(以及 SQL 的一般问题):是否有办法检索在 "update" 或 [= 之后修改或插入的 ID 列表18=] 不经过重型机械日志记录的请求?

提前感谢您的想法或对这个问题的看法。

谢谢

如评论中所建议...对于插入,使用 SELECT <..> FROM FINAL TABLE 版本的插入

  CREATE TABLE EMPSAMP 
    (EMPNO     INTEGER GENERATED ALWAYS AS IDENTITY,
     NAME      CHAR(30),
     SALARY    DECIMAL(10,2),
     DEPTNO    SMALLINT,
     LEVEL     CHAR(30),
     HIRETYPE  VARCHAR(30) NOT NULL DEFAULT 'New Employee',
     HIREDATE  DATE NOT NULL WITH DEFAULT)


SELECT EMPNO, HIRETYPE, HIREDATE
  FROM FINAL TABLE ( INSERT INTO EMPSAMP (NAME, SALARY, DEPTNO, LEVEL)
                                 VALUES('Mary Smith', 35000.00, 11, 'Associate'))

如果插入后的触发器或引用约束改变了插入的数据,使用上述 FINAL TABLE 将导致错误。您可以改用 NEW TABLE。但是,NEW TABLE 的结果来自前后触发器和引用约束。因此,最终在 table 中的数据可能与返回的数据不同。

不幸的是,UPDATE 语句没有等效的 data-change-table-reference..

更新的用例是什么?

如果您已经为每一行创建了一个唯一的 ID,您可以只创建一个临时的 ID 数据集,然后 update/insert 数据。

对于插入,其他答案也可以。

要更新,您可以执行以下操作。

Declare global temporary table updatedID
( <ID NAME> <ID TYPE> );
Insert into session.updatedID
Select <ID> from <TABLE> where <CONDITIONAL CLAUSE>
;
Update <TABLE> set <SET STATMENTS> where <ID> in (Select <ID NAME> from session.updatedID)
;
--Optional
Drop table updateID;

它的工作有点倒退,但这是避免必须处理日志并避免逐条记录地迭代文件以更新(使用 FOR 循环)的最简单方法。