Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 23/03/2011, 15h42   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
Par défaut Numéro de séquence

Bonjour,

Je suis un débutant PL/SQL et j'aimerai faire une fonction "ma_fonction" qui permet de retourner la dernière valeur d'un séquence.

Citation:
SELECT maSequence FROM dual;
Pour que ensuite, crée une procédure qui permet de créer une séquence qui commence par la valeur retournée par la première fonction:

Citation:
CREATE SEQUENCE maSequence
START WITH ma_fonction
MAXVALUE 99999999
MINVALUE 1
CYCLE CACHE 20 NOORDER;
Pourriez vous m'aider ??

merci d'avance.
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 15h45   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
C’est un serpent qui se morde la queue.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 16h22   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Un truc comme ça ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SQL> DROP sequence maseq1;
 
SÚquence supprimÚe.
 
SQL> CREATE sequence   maseq1 start WITH 123 maxvalue 99999999 minvalue 1 cycle nocache ORDER;
 
SÚquence crÚÚe.
 
SQL> DROP sequence maseq2;
 
SÚquence supprimÚe.
 
SQL> CREATE OR REPLACE procedure ma_proc ( sequence_de_ref IN varchar2, nouvelle_sequence IN varchar2 ) IS
  2    seqval number;
  3  begin
  4    execute immediate 'select '||trim(sequence_de_ref)||'.currval from dual' INTO seqval;
  5    execute immediate 'create sequence '||nouvelle_sequence||' start with '||to_char(seqval)||' maxvalue 99999999 minvalue 1 cycle cache 20 noorder' ;
  6  end;
  7  /
 
ProcÚdure crÚÚe.
 
SQL> SELECT maseq1.NEXTVAL FROM dual;
 
   NEXTVAL
----------
       123
 
SQL> exec ma_proc( 'maseq1', 'maseq2' )
 
ProcÚdure PL/SQL terminÚe avec succÞs.
 
SQL> SELECT maseq2.NEXTVAL FROM dual;
 
   NEXTVAL
----------
       123
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 17h07   #4
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
@mnitu : non ce n'est pas un serpent qui se mord la queue. Je vais donner plus de détails afin de comprend le but.

J'ai deux schémas sur une seule base : (schema_1, schema_2 sur ma_base)
j'ai une séquence qui s'appelle ma_seq sur schema_1. Le but c'est de faire une fonction qui permet de récupérer la dernière valeur de ma_seq sur schema_1 et de créer la même séquence "ma_seq" dans le deuxième schéma "schema_2" qui prend la valeur de la fonction comme start value.

ojo77: merci mais le problème c'est que ça n'est pas dans le même schéma et je sais pas cmt faire des select sur un schéma alors que je suis connecté sur un autre. Je sais pas si je suis clair...
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 17h30   #5
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Et ceci

Sur Schema1
Code :
1
2
3
4
5
6
7
CREATE sequence TEST1 start WITH 1;
GRANT ALL ON test1 TO schema2;
 1* SELECT test1.NEXTVAL FROM dual
SQL> /
   NEXTVAL
----------
         1
Sur Schema2
Code :
1
2
3
4
5
6
7
 
SELECT schema1.test1.NEXTVAL FROM dual
SQL> / 
 
   NEXTVAL
----------
         2
Et voilu

Vous pouvez aussi creer un " public synonym " pour que le select soit identique sur vos 2 schemas
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 10h58   #6
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
le truc c'est que cette procédure est faite pour migrer la séquence d'un schéma à un autre pour qu'en suite on ait plus besoin du premier schéma !!
là tu fais appelle a la séquence du premier schéma dans le deuxième.
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 11h40   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par azahiri Voir le message
le truc c'est que cette procédure est faite pour migrer la séquence d'un schéma à un autre pour qu'en suite on ait plus besoin du premier schéma !!
Utilisez dbms_metadata
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
WITH the Partitioning, OLAP, DATA Mining AND Real Application Testing options
 
SQL> SET long 1000000000 longc 60000
SQL> SELECT dbms_metadata.get_ddl('SEQUENCE','EMPLOYEES_SEQ') seq
  2    FROM dual
  3  /
 
SEQ
--------------------------------------------------------------------------------
 
 
   CREATE SEQUENCE  "MNI"."EMPLOYEES_SEQ"  MINVALUE 1 MAXVALUE 99999999999999999
 
9999999999 INCREMENT BY 1 START WITH 207 NOCACHE  NOORDER  NOCYCLE
 
 
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 14h43   #8
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
J'ai rien compris à ce que tu as mis, surtout que tu donnes start with 207 alors que je cherche à commencer par la valeur que j'aurai récupéré de la séquence du schéma1
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 14h52   #9
Invité de passage
 
Inscription : octobre 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 23
Points : 2
Points : 2
grace à vos réponses j'ai essayé de faire un script qui me semble logique! jetez y un coup d'oeil et dites moi ce que vous en pensez :

Code :
1
2
3
4
5
6
7
8
9
10
DROP sequence PM_AMR_XM_SEQ; 
CREATE OR REPLACE procedure migration_seq ( sequence_de_ref IN varchar2, nouvelle_sequence IN varchar2 ) IS
seqval number;
begin
execute immediate 'select schéma1.'||trim(sequence_de_ref)||'.currval from dual' INTO seqval;
execute immediate 'create sequence schéma2.'||nouvelle_sequence||' start with '||to_char(seqval)||' maxvalue 99999999 minvalue 1 cycle cache 20 noorder' ;
end;
/
 
exec migration_seq( 'maseq1', 'maseq2' )
Merci.
azahiri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 16h23   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par azahiri Voir le message
J'ai rien compris à ce que tu as mis, surtout que tu donnes start with 207 alors que je cherche à commencer par la valeur que j'aurai récupéré de la séquence du schéma1
Jouez un peu avec dbms_metadata sur une de vos séquences. Lisez aussi la documentation DBMS_METATDA. Ca peut vous éviter de réinventer la roue.

Votre procédure n’est pas correcte, elle implique que la séquence a été déjà utilisée dans la même session qui exécute la procédure via nextval. Dans le cas général il n’y a rien qui le garanti.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h43.


 
 
 
 
Partenaires

Hébergement Web