Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/04/2008, 11h08   #1
Nouveau Membre du Club
 
Inscription : décembre 2005
Messages : 104
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 104
Points : 38
Points : 38
Par défaut Valeur courante d'une séquence

Bonjour,

je voudrais réaliser un script PL qui récupère la valeur courante d'une séquence.
Or lors de l'exécution de la commande :
Code :
1
2
 
SELECT maSeq.CURRVAL FROM DUAL;
J'ai l'erreur ORA 08002 qui dit que :

Cause: sequence CURRVAL has been selected before sequence NEXTVAL

Action: select NEXTVAL from the sequence before selecting CURRVAL


Bref du coup je me demande s'il existe un moyen de récupérer la valeur d'une séquence sans être précédemment obligé de l'incrémenter ?

Merci pour vos réponses
tchoimars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 11h15   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Code :
1
2
SELECT last_number FROM user_sequences
WHERE sequence_name = 'NOM_SEQUENCE'
(le nom de la séquence est stocké en majuscules dans la table)
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 11h20   #3
Nouveau Membre du Club
 
Inscription : décembre 2005
Messages : 104
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 104
Points : 38
Points : 38
merci
tchoimars est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 11h22   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Attention au cache.

Le Last_number donne le prochain chargement du cache.

Exemple avec un cache de 20, sur une séquence non chargée en mémoire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT last_number
FROM user_sequences
WHERE sequence_name = 'S_BESREV'
 
382
 
SELECT  S_BESREV.NEXTVAL
FROM dual
 
382
 
SELECT last_number
FROM user_sequences
WHERE sequence_name = 'S_BESREV'
 
402
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 11h39   #5
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Bien vu McM. Dans ce cas, voici une version qui tient compte du cache:
Code :
1
2
SELECT last_number - cache_size FROM user_sequences
WHERE sequence_name = 'MA_SEQUENCE'
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 12h21   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Non, toujours pas

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT last_number, last_number - cache_size 
FROM user_sequences
WHERE sequence_name = 'S_BESREV'
 
LAST_NUMBER	LAST_NUMBER-CACHE_SIZE
402	382
 
SELECT  S_BESREV.NEXTVAL
FROM dual
383
 
SELECT last_number, last_number - cache_size 
FROM user_sequences
WHERE sequence_name = 'S_BESREV'
LAST_NUMBER	LAST_NUMBER-CACHE_SIZE
402	382
Les n° de séquence sont stockés en base.

Quand on fait appel au n° suivant (nextval), la première fois, Oracle monte en mémoire les "cache" n° suivants, et met à jour le prochain n° de la séquence en base (last_number)

Tant qu'on n'a pas atteint la fin des n° en mémoire ou que ces n° en mémoire ne sont pas effacés (flush, ou écrasement), les nextval suivant lisent le n° en mémoire.
En base, rien ne change.

Il n'y a aucun moyen de savoir quel est le prochain n° qui sera attribué sans le réserver par un nextval si le cache > 1.

Mettre un cache = 1 pour une séquence qui bouge beaucoup n'est pas trop recommandé vu qu'Oracle est donc obligé de poser un verrou sur la séquence (pour la mettre à jour) puis de la monter en mémoire, et ce à chaque appel.

Un petit exemple de ce qu'il y a en base (last_number de user_sequences) et en mémoire avec un cache de 5
Citation:
base = 1, Mémoire vide
NEXTVAL
Base = 6, Memoire 1-5:N° attrib=1
NEXTVAL
Base = 6, Memoire 1-5:N° attrib=2
NEXTVAL
Base = 6, Memoire 1-5:N° attrib=3
FLUSH
Base = 6, Memoire Vide
NEXTVAL
Base = 11, Memoire 6-10:N° attrib=6
NEXTVAL
Base = 11, Memoire 6-10:N° attrib=7
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2008, 14h05   #7
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

on peut remédier ce problème avec
Code :
1
2
 
ALTER SEQUENCE seq_cache NOCACHE;
problème de l'erreur08002
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
begin 
declare v number ;
curr_not_found exception ;
pragma exception_init(curr_not_found ,-08002);
begin 
SELECT nom_seq.currval 
INTO v
FROM dual;
exception 
when curr_not_found then 
SELECT nom_seq.NEXTVAL 
INTO v
FROM dual;
when others then 
.......
end ;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h16.


 
 
 
 
Partenaires

Hébergement Web