2016-01-15 11 views
8

Oracle 12c以降、IDENTITYフィールドを使用できます。Oracleが最後に挿入されたIDENTITYを取得します

最後に挿入されたID(つまり、select @@identityまたはselect LAST_INSERTED_ID()など)を取得する方法はありますか?

+0

を取得するのに役立ちます

INSERT INTO yourtable (....) VALUES (...) RETURNING pk_id INTO yourtable; 

を確認してください。最後に生成された値を得るために通常の 'sequence.currval'を使うことができます。 –

+0

問題はシーケンスの名前を知る必要があることです。 Actaullyは、テーブルの名前とレコードを挿入したスキーマの名前(シーケンスの名前はそれらに関連しています)を知るのは難しいです。 – bubi

+1

挿入しているテーブルの名前を知ることはできませんか? –

答えて

7

Oracleは、12cのIDENTITY機能に順序とデフォルト値を使用します。したがって、質問のシーケンスについて知る必要があります。

まず、テスト用のIDテーブルを作成します。

CREATE TABLE IDENTITY_TEST_TABLE 
(
    ID NUMBER GENERATED ALWAYS AS IDENTITY 
, NAME VARCHAR2(30 BYTE) 
); 

まず、このID列で作成されたシーケンス名を見つけます。このシーケンス名は、テーブルのデフォルト値です。

Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS 
where TABLE_NAME = 'IDENTITY_TEST_TABLE'; 

は私のために、この値は "ISEQ $$ _ 193606" である

は、いくつかの値を挿入します。

INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla'); 
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın'); 

次に、値を挿入し、同一性を検索します。

INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla'); 
SELECT "ISEQ$$_193606".currval from dual; 

あなたのID値が表示されます。 1ブロックで使いたい場合は

declare 
    s2 number; 
begin 
    INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2; 
    dbms_output.put_line(s2); 
end; 

最後のIDは自分のID列名です。

+0

これは唯一の正解です。挿入しようとしている同じセッションで ' .currval'を評価していることを確認するだけです。 – Ben

0

あなたのスコープ、グローバルまたは最後のユーザーを挿入は何ですか?具体的には、トランザクション内であなたのインサート&クエリをカプセル化した場合 グローバルの場合は、ちょうど

SELECT mytable_seq.nextval MyTableID FROM DUAL 

https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402

を使用しています。それが使用するテーブルを使用して自動的にシーケンスを作成し、ドロップ -

+0

答えをありがとう!スコープは最後のユーザーです。私はあなたの提案はMySQLのためだけに働くと思います。 Oracleでは(構文エラー)また、 'FROM Dual'節を追加しても機能しません。 – bubi

+0

ああ、申し訳ありませんが、私はリンクを更新しました –

+0

それはグローバルのためです(私は現在でも使うことができますが、まだグローバルです) – bubi

1

IDENTITY列は「フードの下」SEQUENCEを使用します。 また、 を1000から始まり2ずつ増やしてstartとincrementのパラメータを指定することができます。IDENTITYを使用することは、値を直接操作したくない場合には非常に便利です。

しかし、あなたが何らかの形で直接シーケンスを操作する必要がある場合は、Oracle 12cに利用できる 別のオプションを使用する必要があり - 列のデフォルト値を。 Sutchデフォルト 値はシーケンスnextvalまたはcurrvalから生成することができます。わかりやすいシーケンス名を持ち、それをトリガーなしで「アイデンティティ」として使用できるようにする。

create table my_new_table 
(id number default my_new_table_seq.nextval not null) 

いつでも電話できるのはmy_new_table_seq.currvalです。

RETURNING句を使用してINSERT文にSEQUENCEから生成されたIDを取得することが可能です。例えば

、一時テーブルを作成します。

create global temporary table local_identity_storage ("id" number) on commit delete rows 

いくつかの挿入は一時テーブルにこの値を保存してください:

CREATE TABLE identity_test_table (
    id_ident   NUMBER GENERATED BY DEFAULT AS IDENTITY, 
    same_value VARCHAR2(100) 
); 

declare 
    v_id number(10, 0); 
begin 
    INSERT INTO identity_test_table 
    (same_value) 
    VALUES 
    ('Test value') 
    RETURNING id_ident INTO v_id; 

    insert into local_identity_storage ("id") values (v_id); 
    commit; 
end; 

今、あなたは "ローカル" 挿入IDを持っています。

select "id" from local_identity_storage 
1

オラクル社では、IDがサポートされているというだけでIDENTITYを実装したようです。すべてはまだSEQUENCESを使用して実装されており、作業の一部を行うためにSEQUENCEにアクセスする必要があります(最新のIDENTITYを取得するなど)。

IDENTITYをMySQL、SQL Server、DB2などと同様に取得する方法はありません。SEQUENCEを使用して取得する必要があります。

+1

はい、SEQUENCEよりも抽象的ですが、INSERT節の構文が変更されます。パフォーマンスに反映されます。 3つの異なる手法(ここでは[https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1]から取得した結果)を使用して、このテスト(Oracle 12cで挿入)を確認してください。 1)TRIGGER_IDENTITY :時間= 217hsecs CPU時間= 204hsecs; 2)直接使用シーケンス:時間= 26hsecs CPU時間= 22hsecs; 3)REAL_IDENTITY:時間= 28hsecs CPU時間= 26hsecs。 –

+0

Oracle Databaseへの移行を容易にするために行われました。手動でシーケンスやトリガを作成して挿入時に起動する必要はありません。データベースがこれを実行します。私はオラクルについては言及していませんが、移行を支援するために他に何をしたのか興味があれば、その件に関するホワイトペーパーがあります。 – thatjeffsmith

+0

@thatjeffsmith私は正確に移行を行っていますが、他のDBMSと同様の動作をすることなく、作業は難しいです。 – bubi

0

それは `identity`列がまだバックグラウンドでシーケンスを使用して、最後に挿入された行

関連する問題