我知道我们很少见,我们这些穷人正在使用iSeries for DB2 / AS400,但我希望有人可以回答这个简单的问题。有没有办法在不使用两行SQL的情况下从insert语句返回标识值?我被迫在C#中使用内联SQL来执行插入,然后我需要使用为插入生成的标识。简而言之,我需要iSeries DB2等同于Oracle的“RETURNING”。即,
INSERT INTO AwesomeTable (column1, column2, etc.)
VALUES (value1, value2, etc.)
RETURNING something;
任何?提前谢谢。
编辑:除非有人知道我可以在一个IBM.Data.DB2.iSeries.iDB2Command(不是存储过程)中执行两行SQL,我想在一行中完成所有这一切SQL
答案 0 :(得分:14)
我不确定iSeries,但以下工作在db2v8.1上:
考虑“ID”是您的标识列的名称。以下stmt将返回新生成的id(插入stmt插入的id):
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));
希望这会有所帮助:)
答案 1 :(得分:7)
您需要使用IDENTITY_VAL_LOCAL
标量函数。来自IBM documentation:
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
答案 2 :(得分: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**