代码之家  ›  专栏  ›  技术社区  ›  AJ.

iSeries DB2—有没有任何方法可以从INSERT语句中选择标识值?

  •  17
  • AJ.  · 技术社区  · 15 年前

    我知道我们是很少见的,我们这些可怜的人正在为DB2/AS400使用iSeries,但是我希望有人能回答这个简单的问题。有没有办法从INSERT语句返回标识值而不使用两行SQL?我被迫在c中使用内联sql来执行插入,然后我需要使用为插入生成的标识,以便以后执行某些操作。简单地说,我需要与Oracle的“returning”等价的iSeries DB2。

    INSERT INTO AwesomeTable (column1, column2, etc.)
        VALUES (value1, value2, etc.)
        RETURNING something;
    

    有人吗?提前谢谢。

    编辑:除非有人知道我可以在一个ibm.data.db2.iseries.idb2命令(不是存储过程)中执行两行sql,否则我希望在一行sql中执行这一切

    3 回复  |  直到 15 年前
        1
  •  14
  •   Rashmi Pandit    15 年前

    我对iSeries不太确定,但以下是在db2v8.1上工作的:

    认为“id”是您的标识列的名称。以下stmt将返回新生成的id(与insert stmt插入的id相同):

    SELECT ID FROM FINAL TABLE (
        INSERT INTO AwesomeTable (column1, column2, etc.)
                VALUES (value1, value2, etc.)    
        )
    

    我在公共图书馆找到了一些解释: (我引用它来测试我上面的查询)

         /* The following SELECT statement references an INSERT statement in its
               FROM clause.  It inserts an employee record from host variables into
               table company_b.  The current employee ID from the cursor is selected
               into the host variable new_id.  The keywords FROM FINAL TABLE
               determine that the value in new_id is the value of ID after the
               INSERT statement is complete.
    
               Note that the ID column in table company_b is generated and without
               the SELECT statement an additional query would have to be made in
               order to retreive the employee's ID number.
            */
            EXEC SQL SELECT ID INTO :new_id
                     FROM FINAL TABLE(INSERT INTO company_b
                     VALUES(default, :name, :department, :job, :years, :salary, 
                            :benefits, :id));
    

    希望这有帮助:)

        2
  •  7
  •   Vinay Sajip    15 年前

    你需要使用 IDENTITY_VAL_LOCAL 标量函数。从 IBM documentation 以下内容:

    本地身份 是一个 非确定性函数 返回最近分配的 标识列的值。

    例子:

    CREATE TABLE EMPLOYEE
        (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY,
         NAME CHAR(30),
         SALARY DECIMAL(5,2),
         DEPT SMALLINT)
    
    INSERT INTO EMPLOYEE
        (NAME, SALARY, DEPTNO)
        VALUES('Rupert', 989.99, 50)
    
    SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
    
        3
  •  0
  •   Benny Hill Mark Plumridge    11 年前

    下面是一个例子:

    CREATE TABLE AUTOINC (                                       
       AUTO91 INTEGER       GENERATED ALWAYS AS IDENTITY,          
       SCDS91 CHAR(35)      NOT NULL DEFAULT '',                   
       MCLD91 DECIMAL(3,0)  NOT NULL DEFAULT 0,                    
       CONSTRAINT PK_AUTOINC PRIMARY KEY(AUTO91));
    

    //注意auto increment字段所在的默认关键字。

    insert into AUTOINC Values( default ,'SYSC' , 0 )
    

    //并使用函数返回最后一个标识列值。

    //注意:仅获取第一行。

    select **IDENTITY_VAL_LOCAL**() from AUTOINC **fetch first row only**