web-dev-qa-db-fra.com

Récupérer Oracle IDENTITY inséré en dernier

Depuis Oracle 12c, nous pouvons utiliser les champs IDENTITY.

Existe-t-il un moyen de récupérer la dernière identité insérée (c'est-à-dire select @@identity Ou select LAST_INSERTED_ID() et ainsi de suite)?

10
bubi

Bien. Oracle utilise des séquences et des valeurs par défaut pour la fonctionnalité IDENTITY dans 12c. Par conséquent, vous devez connaître les séquences de votre question.

Créez d'abord une table d'identité de test.

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

Tout d'abord, recherchons le nom de votre séquence créé avec cette colonne d'identité. Ce nom de séquence est une valeur par défaut dans votre table.

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

pour moi, cette valeur est "ISEQ $$ _ 193606"

insérez quelques valeurs.

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

puis insérez la valeur et trouvez l'identité.

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

vous devriez voir votre valeur d'identité. Si vous voulez faire en un seul bloc, utilisez

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

Le dernier ID est le nom de ma colonne d'identité.

12
Atilla Ozgur

Vérifiez s'il vous plaît

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

Il vous aidera à récupérer la dernière ligne insérée

2
Jawad Siddiqui

La colonne IDENTITY utilise un SEQUENCE "sous le capot" - créant et supprimant automatiquement la séquence avec la table qu'elle utilise. De plus, vous pouvez spécifier les paramètres start with et increment en utilisant start with 1000 et increment by 2. Il est vraiment très pratique d'utiliser IDENTITY lorsque vous ne voulez pas utiliser directement ses valeurs.

Mais si vous devez en quelque sorte opérer directement la séquence, vous devez utiliser une autre option disponible dans Oracle 12c - valeurs par défaut des colonnes. Les valeurs par défaut de Sutch peuvent être générées à partir de la séquence nextval ou currval. Pour vous permettre d'avoir un nom de séquence compréhensible et de l'utiliser comme "identité" sans déclencheur.

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

Vous pourrez toujours appeler: my_new_table_seq.currval.

Il est possible d'obtenir l'ID généré à partir de SEQUENCE sur l'instruction d'insertion en utilisant la clause RETURNING.

Par exemple, créez une table temporaire:

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

Faites quelques insertions en enregistrant cette valeur dans la table temporaire:

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;

Vous avez maintenant un identifiant inséré "local".

select "id" from local_identity_storage
1
Mikhailov Valentine

Il semble qu'Oracle ait implémenté IDENTITY juste pour dire qu'ils prennent en charge les identités. Tout est toujours implémenté à l'aide de SEQUENCES et parfois vous devez accéder à SEQUENCE pour effectuer une partie du travail (c'est-à-dire récupérer le dernier IDENTITY inséré).

Il n'existe aucun moyen de récupérer le IDENTITY similaire à MySQL, SQL Server, DB2, etc., vous devez le récupérer à l'aide du SEQUENCE.

1
bubi

Comme je l'ai écrit dans cet article de blog , vous pouvez récupérer toutes les valeurs d'identité actuelles de votre schéma avec une seule requête:

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

Quelle est votre portée, globale ou dernier utilisateur inséré? Si global, utilisez simplement

SELECT mytable_seq.nextval MyTableID FROM DUAL

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

Si spécifique, encapsulez vos insertions et requêtes dans une transaction.

0
krish KM