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)?
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é.
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
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
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
.
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;
/
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.