ISeries DB2 - Есть ли способ выбрать значение идентификатора из инструкции insert?
Я знаю, что мы редки, мы, бедные люди, которые используют iSeries для DB2/AS400, но я надеюсь, что кто-то сможет ответить на этот простой вопрос. Есть ли способ вернуть значение идентификатора из инструкции insert без использования двух строк SQL? Я вынужден использовать встроенный SQL в С# для выполнения вставки, а затем мне нужно использовать идентификатор, сгенерированный для вставки для чего-то позже. Проще говоря, мне нужен iSeries DB2, эквивалентный Oracle "RETURNING". То есть.
INSERT INTO AwesomeTable (column1, column2, etc.)
VALUES (value1, value2, etc.)
RETURNING something;
Кто-нибудь? Спасибо заранее.
EDIT: если кто-то не знает пути, я могу выполнить две строки SQL в одном файле IBM.Data.DB2.iSeries.iDB2Command (а не в хранимой процедуре), я хотел бы сделать это все в одной строке SQL
Ответы
Ответ 1
Я не уверен в iSeries, но следующее работало на db2v8.1:
Рассмотрим "ID" - это имя вашего столбца идентификатора. Следующий stmt вернет вновь сгенерированный id (тот же, который вставлен в stmt вставки):
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 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
Вам нужно использовать скалярную функцию 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
Ответ 3
Вот пример:
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**