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 :

Sequence Oracle : creation et récupération de NEXTVAL


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Par défaut Sequence Oracle : creation et récupération de NEXTVAL
    Bonjour à tous.

    Je cherche à faire une fonction qui prend en paramètre un nom de séquence, qui vérifie si cette séquence existe, et qui retourne la valeur de son NEXTVAL.

    Si la séquence n'existe pas, elle est créée par la fonction.

    J'ai réussi sans difficulté à créer la séquence si elle n'existe pas, néanmoins, je n'arrive pas à retourner la valeur de NEXTVAL.

    Mon problème vient du fait que je ne sais pas sur quel objet je dois appeler le .NEXTVAL (s_seqname ou '||s_seqname||').

    Voici mon bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE or REPLACE FUNCTION F_CHECK_CREATE_SEQ (s_seqname varchar2) RETURN NUMBER AS
      nb INTEGER;
      res INTEGER;
    BEGIN
      SELECT COUNT(*) INTO nb
      FROM USER_SEQUENCES
      WHERE sequence_name=s_seqname;
      if nb=0 then
        execute immediate  'CREATE SEQUENCE '|| s_seqname||' START WITH 1 INCREMENT BY 1 MAXVALUE 9999 NOCYCLE';
      end if;
      SELECT s_seqname.NEXTVAL INTO res FROM dual;
      RETURN res;
    END;
    Les erreurs de compilations sont pour la ligne SELECT s_seqname.NEXTVAL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Erreur(11,3): PL/SQL: SQL Statement ignored 
    Erreur(11,10): PLS-00487: Invalid reference to variable 'S_SEQNAME'
    Erreur(11,10): PL/SQL: ORA-02289: sequence does not exist
    Avec '||s_seqname||'.NEXTVAL j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Erreur(11,3): PL/SQL: SQL Statement ignored 
    Erreur(11,26): PL/SQL: ORA-00923: FROM keyword not found where expected
    Si quelqu'un peut simplement m'expliquer pourquoi cela n'est pas possible d'exécuter le SELECT je lui en serait très reconnaissant.
    Je poursuis mes recherches en attendant, merci de votre aide.

    Cdt

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Utilises execute immediate.
    seqname est une chaine de caractère, pas un nom de séquence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'SELECT '||s_seqname ||'.NEXTVAL FROM dual' INTO v_res;

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Par défaut
    Merci, tellement évident quand on voit le résultat!

    Désolé pour le dérangement, je ne pensais pas du tout au fait d'utiliser le EXECUTE IMMEDIATE pour le select!

    Merci encore


    Edit :

    Lors de l'appel de cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT f_check_create_seq('toto') FROM DUAL;
    j'ai eu un problème bien connu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-14552 : cannot perform a DDL, commit or rollback inside a query or DML
    Je ne sais pas si c'est la meilleure solution que j'ai choisi, mais j'ai ajouté dans ma déclaration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace
    FUNCTION F_CHECK_CREATE_SEQ (s_seqname varchar2) RETURN INTEGER
    AS
    PRAGMA AUTONOMOUS_TRANSACTION;
    ...
    En espérant que ca aide certaines personnes souhaitant faire la même chose que moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Equivalent Sequence Oracle en SQLServer
    Par Gabbe_pro dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 25/02/2010, 21h32
  2. Sequence Oracle : double incrémentation
    Par woodwai dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/11/2006, 13h50
  3. genID pour sequence oracle
    Par COULON dans le forum XMLRAD
    Réponses: 4
    Dernier message: 11/04/2006, 11h54
  4. [EJB2.1 Entity] EJB Entite CMP et sequence Oracle
    Par kaiser2003 dans le forum Java EE
    Réponses: 5
    Dernier message: 11/03/2006, 10h42
  5. [Oracle] Insert avec récupération valeur de la cle
    Par Silvia12 dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 03h28

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