Informix:最後に挿入されたレコードのIDを取得する方法
質問
INSERTステートメントの後にSERIAL列の値を取得する最も効率的な方法は何ですか?つまりMS SQLの @@ IDENTITY
または SCOPE_IDENTITY
機能を複製する方法を探しています
解決
最後のSERIAL挿入の値は、sqlerrd配列の2番目のエントリとしてSQLCAレコードに保存されます。ブライアンの答えはESQL / Cには正しいですが、使用している言語については言及していません。
ストアドプロシージャを記述している場合、値は次のように見つかります。
LET new_id = DBINFO('sqlca.sqlerrd1');
DBIを使用している場合は、 $ sth-> {ix_sqlerrd} [1]
にもあります
他の言語/インターフェースのバリアントがありますが、きっとあなたはそのアイデアを得るでしょう。
他のヒント
これが使用されているのを見ました。
if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
Result := -(Abs(LOCAL_SQLCA^.sqlcode));
「効率的」だとは思わないここで探している言葉です。それは正確さの問題です。 SQL Books Onlineで説明できるよりも良い説明ができるかどうかはわかりませんが、一般的に、あなたが何をしているかを本当に理解していて、@@ IDENTITYを使用する特定の理由がない限り、SCOPE_IDENTITYを使用します。これの最も明白な理由は、トリガーがテーブルにアタッチされている場合、@@ IDENTITYがプログラム/ sp / etcによって追加された最新のレコードのIDを返さないことです。また、2つのトランザクションが同時に発生し、以下が発生する大量のアプリケーションで問題が発生する可能性があります...
- あなたの挿入
- 他のユーザーの挿入
- 他のユーザーの身元をあなたに返す
OPは使用されているInformixのバージョンを指定しなかったため、異なる回答が存在する可能性があります
所属していません StackOverflow