IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Numéro de séquence


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    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.

    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:

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

    merci d'avance.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    C’est un serpent qui se morde la queue.

  3. #3
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Un truc comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    @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...

  5. #5
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Et ceci

    Sur Schema1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    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.

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  8. #8
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    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

  9. #9
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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.

Discussions similaires

  1. [AC-2003] création d'un numéro de séquence
    Par Syl_13 dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/08/2009, 12h02
  2. Numéro de séquence non autorisé ici
    Par ronald.kooman dans le forum Oracle
    Réponses: 4
    Dernier message: 19/03/2009, 08h49
  3. Requête SQL avec "numéro de séquence"
    Par MatthieuQ dans le forum Développement
    Réponses: 8
    Dernier message: 23/01/2009, 13h34
  4. Réponses: 1
    Dernier message: 14/01/2008, 15h45
  5. Récupérer un numéro de séquence
    Par R1pToR dans le forum Struts 1
    Réponses: 22
    Dernier message: 17/07/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo