18

我知道我们很少使用 iSeries for DB2/AS400 的穷人,但我希望有人能回答这个简单的问题。有什么方法可以在不使用两行 SQL 的情况下从插入语句返回标识值?我被迫在 C# 中使用内联 SQL 来执行插入,然后我需要使用为插入生成的标识稍后进行某些操作。简单地说,我需要 iSeries DB2 等价于 Oracle 的“返回”。IE,

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

任何人?提前致谢。

编辑:除非有人知道我可以在一个 IBM.Data.DB2.iSeries.iDB2Command (不是存储过程)中执行两行 SQL 的方法,否则我想在一行 SQL 中完成这一切

4

3 回答 3

14

我不确定 iSeries,但以下适用于 db2v8.1:

考虑“ID”是您的身份列的名称。以下 stmt 将返回新生成的 id(与插入 stmt 插入的相同):

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

我在 publib 网站上找到的一些解释:(我用它作为参考来测试我上面的查询)

     /* 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));

希望这可以帮助 :)

于 2009-07-15T06:26:20.663 回答
7

您需要使用IDENTITY_VAL_LOCAL标量函数。从IBM 文档

IDENTITY_VAL_LOCAL是一个非确定性函数,它返回最近为标识列分配的值。

例子:

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
于 2009-07-10T14:00:22.837 回答
0

这是一个例子:

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));

// 注意自动增量字段所在的默认关键字。

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

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

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

select **IDENTITY_VAL_LOCAL**() from AUTOINC **fetch first row only**
于 2013-12-16T13:38:31.197 回答