LAST_IDENTITY (SQL)
構文
LAST_IDENTITY()
概要
LAST_IDENTITY 関数は、%ROWID ローカル変数値を返します。%ROWID ローカル変数は、埋め込み SQL または ODBC の値に設定されます。%ROWID ローカル変数は、ダイナミック SQL、SQL シェル、または管理ポータルの SQL インタフェースによる値には設定されません。ダイナミック SQL は、その代わりに %ROWIDOpens in a new tab オブジェクト・プロパティを設定します。
LAST_IDENTITY 関数は引数を取りません。引数の括弧は必須です。
LAST_IDENTITY は、現在のプロセスによって最後に影響を受けた行の IDENTITY フィールドの値を返します。テーブルに IDENTITY フィールドがない場合は、現在のプロセスによって最後に影響を受けた行の行 ID (%ROWID) を返します。返り値は INTEGER データ型です。
-
埋め込み SQL の INSERT、UPDATE、DELETE、または TRUNCATE TABLE 文の場合は、LAST_IDENTITY は最後に変更された行の IDENTITY または %ROWID 値を返します。
-
埋め込み SQL のカーソル・ベースの SELECT 文の場合は、LAST_IDENTITY は最後に取得された行の IDENTITY または %ROWID 値を返します。ただし、カーソル・ベースの SELECT 文に DISTINCT キーワードまたは GROUP BY 節が含まれる場合は、LAST_IDENTITY は変更されず、前の値がある場合はそれを返します。
-
埋め込み SQL の単一行 (非カーソル) の SELECT 文の場合は、LAST_IDENTITY は変更されません。前の値がある場合は、それが返されます。
プロセスの開始時に、LAST_IDENTITY は NULL を返します。NEW %RowID に続けて、LAST_IDENTITY は NULL を返します。
操作の影響を受けた行がない場合は、LAST_IDENTITY は変更されません。LAST_IDENTITY は、前の値がある場合は、それを返します。NEW %RowID に続けて、LAST_IDENTITY を呼び出すと NULL が返されますが、%ROWID を呼び出すと <UNDEFINED> エラーが生成されます。
IDENTITY フィールドの詳細は、"CREATE TABLE" を参照してください。"%ROWID" も参照してください。
例
以下の例では、2 つの埋め込み SQL プログラムを使用して LAST_IDENTITY を返しています。最初の例では新しいテーブル Sample.Students を作成し、2 番目の例ではこのテーブルにデータを入力してから、カーソル・ベースの SELECT をデータに対して実行して、それぞれの操作について LAST_IDENTITY を返しています。
2 つの埋め込み SQL プログラムは、示されている順序で実行してください(埋め込み SQL では参照されるテーブルが既に存在していなければ INSERT 文をコンパイルすることができないため、ここでは 2 つの埋め込み SQL プログラムを使用する必要があります)。
WRITE !,"Creating table"
&sql(CREATE TABLE Sample.Students (
StudentName VARCHAR(30),
StudentAge INTEGER,
StudentID IDENTITY))
IF SQLCODE=0 {
WRITE !,"Created table, SQLCODE=",SQLCODE }
ELSEIF SQLCODE=-201 {
WRITE !,"Table already exists, SQLCODE=",SQLCODE }
WRITE !,"Populating table"
NEW %ROWCOUNT,%ROWID
&sql(INSERT INTO Sample.Students (StudentName,StudentAge)
SELECT Name,Age FROM Sample.Person WHERE Age <= '21')
IF SQLCODE=0 {
WRITE !,%ROWCOUNT," records added, last RowID is ",%ROWID,! }
ELSE {
WRITE !,"Insert failed, SQLCODE=",SQLCODE }
&sql(SELECT LAST_IDENTITY()
INTO :insertID
FROM Sample.Students)
WRITE !,"INSERT Last Identity is: ",insertID,!!
/* Cursor-based SELECT Query */
&sql(DECLARE C1 CURSOR FOR
SELECT StudentName INTO :name FROM Sample.Students
WHERE StudentAge = '17')
&sql(OPEN C1)
QUIT:(SQLCODE'=0)
&sql(FETCH C1)
WHILE (SQLCODE = 0) {
WRITE name," is seventeen",!
&sql(FETCH C1) }
&sql(CLOSE C1)
WRITE !,%ROWCOUNT," records queried, last RowID is ",%ROWID,!
&sql(SELECT LAST_IDENTITY()
INTO :qId)
WRITE !,"SELECT Last Identity is: ",qId,!
&sql(DROP TABLE Sample.Students)