2010-09-07 4 views
2

Je suis nouveau avec PL/SQL et j'ai besoin dernier ID inséré dans le tableau de données après instruction d'insertion.SELECT IDENT_CURRENT (« tablename ») dans Oracle

Comme sur MS SQL SELECT IDENT_CURRENT ('tablename')

+0

Dans SQL Server, si vous vous voulez l'ID d'une ligne que vous venez d'insérer, vous devez utiliser 'scope_identity'. 'ident_current' renvoie la dernière valeur d'identité sur toutes les sessions et toutes les étendues. Vous pouvez donc obtenir une valeur pour une insertion dans une autre session. http://msdn.microsoft.com/en-us/library/ms175098.aspx –

Répondre

4

Il n'y a pas intégré dans les champs de autoincrement dans Oracle, vous le créez des séquences en utilisant:

CREATE TABLE some_tab(
     rec_id  INTEGER, 
     some_data VARCHAR2(300) 
); 

CREATE SEQUENCE some_tab_seq; 

CREATE OR REPLACE TRIGGER trig_BI 
    BEFORE INSERT 
    ON some_tab 
    FOR EACH ROW 
BEGIN 
    IF :NEW.rec_id IS NULL 
    THEN 
     :NEW.rec_id := some_tab_seq.NEXTVAL ; 
    END IF; 
END; 

Puis, en PL/SQL, vous pouvez chercher la valeur actuelle de la séquence par

your_var := some_tab_seq.CURRVAL

aussi en version plus ancienne d'Oracle vous ne pouvez pas lire directement NEXTVAL/i CURRVAL Nto var et doivent faire:

SELECT some_tab_seq.CURRVAL 
    INTO your_var 
    FROM DUAL; 
+3

CURRVAL ne fonctionne que si nous avons précédemment sélectionné un NEXTVAL dans la séquence de la session. – APC

+0

faute de frappe: rec_id <> id_rec –

+0

Vous pouvez également regarder sélectionnez sequence_name, LAST_NUMBER de user_sequences, mais la mise en cache et la concurrence (en particulier sur le RAC) en font inexact. –

8

Vous pouvez utiliser la clause RETURNING:

insert into mytable(x,y) values (1,2) returning id into v_id; 

Cela fonctionne bien quand il y a un déclencheur qui remplit une colonne d'identité, de sorte que vous n'avez pas besoin " sélectionnez seq.currval à partir de dual "chose.

2

Oracle ne met pas en œuvre des colonnes d'identité. Il utilise des séquences qui génèrent des nombres uniques qui peuvent être utilisés comme valeurs PK dans n'importe quelle table.

Ainsi, l'expression IDENT_CURRENT ('my_table') est mieux traduite en MySequence.CURRVAL de la séquence d'alimentation PK de la table.

En règle générale, vous souhaitez récupérer la valeur PK insérée dans MS SQL par:

INSERT INTO MyTable ... 
SELECT @PK = SCOPE_IDENTITY() 

Dans Oracle, utilisez l'INSERT RETOURNER clause pour obtenir des fonctionnalités similaires

DECLARE PK ...; 
INSERT INTO MyTable 
RETURNING TableID INTO PK; 
Questions connexes