2009-12-04 4 views
1

I ont une séquence:séquence de déclenchement de problème oracle

CREATE SEQUENCE test_seq START WITH 10000001 INCREMENT BY 1; 

et une table:

create table Entry(
id number(5), 
name varchar(50) ); 

I besoin d'augmenter la valeur de séquence après l'insertion d'une ligne dans la table d'entrée. Donc, je l'ai fait:

CREATE OR REPLACE TRIGGER test_trigger 
after INSERT 
ON Entry 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
SELECT test_seq.nextval INTO :NEW.id FROM dual; 
END; 
/

mais « après » ne fonctionne pas ici, mais « avant » fonctionne. Comment puis-je le faire pour après?

+0

Pourquoi? Quelle différence cela ferait-il quand la séquence est incrémentée? –

Répondre

2

Si vous vraiment voulez incrémenter la séquence après l'insert (qui semble particulière), vous pouvez le faire:

CREATE OR REPLACE TRIGGER test_trigger 
after INSERT 
ON Entry 
REFERENCING NEW AS NEW 
FOR EACH ROW 
DECLARE 
    l_id INTEGER; 
BEGIN 
    SELECT test_seq.nextval INTO l_id FROM dual; 
END; 
/

Bien sûr, cela ne définit pas l'ID de la nouvelle ligne à cette valeur de séquence - mais si vous aviez voulu faire cela, vous auriez fait un déclencheur AVANT.

+0

+1 utile pour moi. – Addicted

1

Habituellement, vous appelez la sequence.nextval dans l'instruction INSERT lui-même:

INSERT INTO your_table 
    (id, ...) 
VALUES 
    (test_seq.nextval, ...) 

Êtes-vous mis sur l'utilisation de la gâchette?

1

Selon this documentation, vous ne pouvez pas mettre à jour les valeurs: NEW lors de l'utilisation d'un déclencheur AFTER INSERT. Pardon!

0

Je ne comprends pas pourquoi vous voudriez incrémenter la séquence après l'insertion; vous allez perdre un nombre important de valeurs de cette façon, car le contexte de la séquence CURRVAL ne peut pas être interrogé dans une session tant que cette session n'a pas appelé NEXTVAL une seule fois.

exécutant la commande suivante déclenche une ORA-08002:

create sequence s1; 
select s1.currval from dual; 

Ainsi, la façon dont vous l'avez codé avec un après déclencheur d'insertion, où est la première valeur pour entry.id vient?

Questions connexes