web-dev-qa-db-ja.com

Oracleの最後に挿入されたIDENTITYを取得

Oracle 12c以降、IDENTITYフィールドを使用できます。

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

10
bubi

上手。 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列名です。

12
Atilla Ozgur

チェックしてください

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

最後に挿入された行を取得するのに役立ちます

2
Jawad Siddiqui

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
1

OracleはIDENTITYを実装して、アイデンティティをサポートしていると言っているようです。まだすべてがSEQUENCESを使用して実装されており、場合によってはSEQUENCEにアクセスして作業を行う必要があります(つまり、最後に挿入されたIDENTITYを取得します)。

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

1
bubi

このブログ投稿 で書いたように、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;
/
0
Lukas Eder

グローバルまたは最後に挿入されたユーザーのスコープは何ですか?グローバルに使用する場合

SELECT mytable_seq.nextval MyTableID FROM DUAL

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

特定の場合、トランザクション内で挿入とクエリをカプセル化します。

0
krish KM