Oracle 12c以降、IDENTITYフィールドを使用できます。
最後に挿入されたID(つまり_select @@identity
_またはselect LAST_INSERTED_ID()
など)を取得する方法はありますか?
上手。 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');
次に、値を挿入してIDを見つけます。
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列名です。
チェックしてください
INSERT INTO yourtable (....)
VALUES (...)
RETURNING pk_id INTO yourtable;
最後に挿入された行を取得するのに役立ちます
IDENTITY
カラムはSEQUENCE
を「内部」で使用します-使用するテーブルでシーケンスを自動的に作成および削除します。また、start with 1000およびstart by 2を使用してstart withおよび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
。
SEQUENCE
句を使用して、挿入ステートメントでRETURNING
から生成された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
OracleはIDENTITY
を実装して、アイデンティティをサポートしていると言っているようです。まだすべてがSEQUENCES
を使用して実装されており、場合によってはSEQUENCE
にアクセスして作業を行う必要があります(つまり、最後に挿入されたIDENTITY
を取得します)。
MySQL、SQL Server、DB2などに似たIDENTITY
を取得する方法はありません。SEQUENCE
を使用して取得する必要があります。
このブログ投稿 で書いたように、1つのクエリでスキーマの現在のID値をすべて取得できます。
with
function current_value(p_table_name varchar2) return number is
v_current number;
begin
for rec in (
select sequence_name
from user_tab_identity_cols
where table_name = p_table_name
)
loop
execute immediate 'select ' || rec.sequence_name || '.currval from dual'
into v_current;
return v_current;
end loop;
return null;
end;
select *
from (
select table_name, current_value(table_name) current_value
from user_tables
)
where current_value is not null
order by table_name;
/
グローバルまたは最後に挿入されたユーザーのスコープは何ですか?グローバルに使用する場合
SELECT mytable_seq.nextval MyTableID FROM DUAL
https://www.sitepoint.com/community/t/Oracle-last-insert-id-question/1402
特定の場合、トランザクション内で挿入とクエリをカプセル化します。