iSeries DB2 - есть ли способ выбрать значение идентификатора из оператора вставки? - PullRequest
17 голосов
/ 10 июля 2009

Я знаю, что мы редки, бедняки, которые используют iSeries для DB2 / AS400, но я надеюсь, что кто-нибудь может ответить на этот простой вопрос. Есть ли способ вернуть значение идентификатора из оператора вставки без использования двух строк SQL? Я вынужден использовать встроенный SQL в C # для выполнения вставки, а затем мне нужно использовать идентификатор, сгенерированный для вставки, для чего-то позже. Проще говоря, мне нужен iSeries DB2, эквивалентный Oracle "ВОЗВРАЩЕНИЕ". То есть.,

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

Кто-нибудь? Заранее спасибо.

РЕДАКТИРОВАТЬ: Если кто-то не знает, как я могу выполнить две строки SQL в одном IBM.Data.DB2.iSeries.iDB2Command (не хранимый процесс), я хотел бы сделать все это в одной строке SQL

Ответы [ 3 ]

14 голосов
/ 15 июля 2009

Я не уверен в iSeries, но на db2v8.1 сработало следующее:

Учтите, что «ID» - это имя вашего столбца идентификации. Следующий stmt вернет вновь сгенерированный идентификатор (тот же, который вставляется 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));

Надеюсь, это поможет:)

7 голосов
/ 10 июля 2009

Вам необходимо использовать скалярную функцию 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
0 голосов
/ 16 декабря 2013

Вот пример:

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**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...