Oracle
 sql >> Base de données >  >> RDS >> Oracle

créer une table avec sequence.nextval dans oracle

Oracle 12c

Nous avons enfin IDENTITY colonnes comme beaucoup d'autres bases de données, dans le cas où une séquence est générée automatiquement dans les coulisses. Cette solution est beaucoup plus rapide qu'une solution basée sur des déclencheurs, comme on peut le voir dans ce billet de blog.

Ainsi, la création de votre table ressemblerait à ceci :

CREATE TABLE qname
(
    qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
    qname    VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);

Oracle 11g et versions antérieures

Selon la documentation, vous ne pouvez pas faire cela :

Restriction sur les valeurs de colonne par défaut Une expression DEFAULT ne peut pas contenir de références à des fonctions PL/SQL ou à d'autres colonnes, les pseudo-colonnes CURRVAL, NEXTVAL, LEVEL, PRIOR et ROWNUM, ou des constantes de date qui ne sont pas entièrement spécifiées.

La manière standard d'avoir des colonnes "d'incrémentation automatique" dans Oracle est d'utiliser des déclencheurs, par exemple

CREATE OR REPLACE TRIGGER my_trigger
  BEFORE INSERT 
  ON qname
  FOR EACH ROW
  -- Optionally restrict this trigger to fire only when really needed
  WHEN (new.qname_id is null)
DECLARE
  v_id qname.qname_id%TYPE;
BEGIN
  -- Select a new value from the sequence into a local variable. As David
  -- commented, this step is optional. You can directly select into :new.qname_id
  SELECT qname_id_seq.nextval INTO v_id FROM DUAL;

  -- :new references the record that you are about to insert into qname. Hence,
  -- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
  -- obtained from your sequence, before inserting
  :new.qname_id := v_id;
END my_trigger;

En savoir plus sur Oracle TRIGGERs dans la documentation