Seules des séquences de valeur entière peuvent être créées.
La déclaration doit donc être :
CREATE SEQUENCE invoice_nun
START WITH 1
INCREMENT BY 1;
Vous pouvez convertir la valeur récupérée en une chaîne et ajouter un préfixe approprié.
select 'INV'||to_char(invoice_nun.nextval,'FM09999999')
from dual;
Vous pouvez créer une fonction pour simuler une séquence renvoyant les valeurs de chaîne appropriées
create or replace function next_invoice_nun return varchar2
as
begin
return('INV'||to_char(invoice_nun.nextval,'FM09999999') );
end;
/
vous pouvez maintenant faire
select next_invoice_nun
from dual;
La séquence telle que définie ci-dessus utilise certaines valeurs par défaut. Ceci est documenté dans la Database SQL Language Reference . Cela équivaut à l'instruction suivante
CREATE SEQUENCE invoice_nun
CACHE 20
NOORDER
START WITH 1
INCREMENT BY 1;
Vous devez être conscient de ce qui suit :
1) Si une transaction récupère une valeur de séquence et annule, la valeur de séquence est perdue. Donc, si vous procédez comme suit :
-- fetch invoice_id INV00000001
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
-- fetch invoice_id INV00000002
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
rollback;
-- fetch invoice_id INV00000003
insert into invoices(invoice_id,...) values (next_invoice_nun,...);
commit;
les identifiants de facture INV00000001
and
INV00000003are inserted in the
tablestable but the invoice id
INV00000002` est perdu car l'instruction qui l'a récupéré a été annulée
2) Si une instance plante, toutes les séquences qui se trouvent dans le cache de l'instance sont perdues. Dans votre exemple, la valeur par défaut du cache est utilisée, à savoir 20. Ainsi, si les instances se bloquent, au plus 20 valeurs de séquence peuvent être perdues. une alternative consiste à utiliser le mot-clé NOCYCLE
si vous créez la séquence, mais cela entraînera des pénalités de performance.
3) Si vous êtes sur un système RAC, le numéro de séquence ne représente pas l'ordre d'extraction de la déclaration. Il est donc possible que la première instruction obtienne l'id INV00000021
et la deuxième instruction obtient l'id INV00000001
si la deuxième instruction est exécutée sur une instance différente de la première instruction. En effet, l'instance a récupéré les 20 premiers numéros de séquences dans son cache et l'autre instance a récupéré les 20 seconds numéros de séquences dans son cache. La première instruction est exécutée sur l'instance qui a extrait les 20 numéros de séquence suivants. Vous pouvez utiliser la ORDER
mot-clé pour éviter cela, mais cela entraînera à nouveau des pénalités de performance
On peut donc éviter 2) et 3) au prix de pénalités de performance mais il n'y a aucun moyen d'éviter 2).