18

iSeries for DB2/AS400 を使用している私たちのような貧しい人々はまれであることは承知していますが、誰かがこの簡単な質問に答えてくれることを願っています。2 行の SQL を使用せずに挿入ステートメントから ID 値を返す方法はありますか? 挿入を実行するために C# でインライン SQL を使用することを余儀なくされており、後で挿入用に生成された ID を使用する必要があります。簡単に言えば、Oracle の「RETURNING」に相当する iSeries DB2 が必要です。すなわち、

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

誰?前もって感謝します。

編集:誰かが1つのIBM.Data.DB2.iSeries.iDB2Command(ストアドプロシージャではない)で2行のSQLを実行できる方法を知らない限り、これをすべて1行のSQLで実行したいと思います

4

3 に答える 3

14

iSeries についてはわかりませんが、db2v8.1 では次のように動作しました。

「ID」は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_LOCALID 列に最後に割り当てられた値を返す非決定論的関数です。

例:

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 )

// そして、関数を使用して最後の ID 列の値を返します。

// 注: 最初の行のみをフェッチします。

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