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

Création d'une séquence Oracle commençant par alphanumérique

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 INV00000001and 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).