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

Oracle Discussion :

Procedure ou fonction PL/QSL


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut Procedure ou fonction PL/QSL
    Bonjour,

    Je voudrais inserer une ligne dans une table qui contient une clé primaire que je voudrais auto-incrémenter avec une sequence. Mon problème est de connaitre la clé générée dans la suite de l'éxecution de mon programme.
    Pour cela, je me suis dis que le plus simple est de créer une fonction PL/SQL qui insert la ligne et retourne la valeur de la clé... mais je n'y arrive pas. Est il possible de faire un Insert dans une function? Pour quoi ne fonctionne t elle pas?

    j'ai créé ma sequence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE SEQUENCE auto_Ref      START WITH 1 INCREMENT BY 1 MAXVALUE 99999;
    et puis ma function:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Create or replace Function add_truc (RefTruc VarChar2,truc2 VarChar2,truc3 Varchar2)
    Return number is ref number;
    Begin
    	ref:= auto_Ref.nextVal;
    	Insert into Tablevalues (ref,Reftruc,truc2,Truc3);
       Return ref;
    End; 
    /
    le message d'erreur que j'obtient (actuellement ) est:
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/2 PL/SQL: Statement ignored
    4/25 PLS-00357: Référence de Table, Vue ou Séquence
    'AUTO_REF.NEXTVAL' non autorisée dans ce contexte
    Que puis-je faire?

    MERCI BEAUCOUP


    [Modération : Titre initial ("[Debutant] Insert dans une functionPL/SQL") édité par LeoAnderson]

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    le nextval ne peut être appelé que dans un select et il manque le mot VALUES dans l'insert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Create or replace Function add_truc (RefTruc VarChar2,truc2 VarChar2,truc3 Varchar2)
    Return number is 
    ref number;
    Begin
       SELECT auto_Ref.nextVal
       INTO ref
       FROM DUAL;
       Insert into Tablevalues values (ref,Reftruc,truc2,Truc3);
       Return ref;
    End;
    /
    Mais je te propose plutôt ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Create or replace Function add_truc (RefTruc VarChar2,truc2 VarChar2,truc3 Varchar2)
    Return number is 
    Begin
       Insert into Tablevalues 
         SELECT auto_Ref.nextVal,Reftruc,truc2,Truc3 FROM dual;
       Return auto_Ref.Currval;
    End;
    /
    Attention, il n'y a pas de COMMIT

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Merci beaucoup de ton aide....

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut [Debutant] Insert dans une functionPL/SQL
    Bonjour,
    Désolé mais dans mon dernier Post, j'ai parler un peu vite, ça ne marche pas...
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE SEQUENCE auto_RefQuestion      START WITH 1 INCREMENT BY 1 MAXVALUE 99999;
     
    Create or replace Function add_question (RefQuest VarChar2,TextQ VarChar2,TypeQ Varchar2)
    Return number is 
    Begin
    	Insert into Question (idquestion,refquestionnaire,text,typereponse)
    		 values 
    			     (select auto_RefQuestion.nextVal, RefQuest,TextQ,TypeQ);	
    	Return auto_RefQuestion.CurVal;
    End; 
    /
    mais j'obtient:
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/2 PL/SQL: SQL Statement ignored
    6/10 PL/SQL: ORA-00936: expression absente
    J'ai beau essayer de la bidouiller mais je ne m'en tire pas...
    Quelqu'un peut il me depanner?
    Merci!!!

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Create or replace Function add_question (RefQuest VarChar2,TextQ VarChar2,TypeQ Varchar2) 
    Return number is 
       v_seq number;
    Begin 
       select auto_RefQuestion.nextVal into v_seq from dual;
       Insert into Question (idquestion,refquestionnaire,text,typereponse) 
        values (v_seq , RefQuest,TextQ,TypeQ);    
       Return (v_seq); 
    End; 
    /
    Voilà qui devrait mieux fonctionner...
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Bingo, ça passe nickel... MERCI mais c'est quoi ce into? je comprend pas bien?

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est justement ce que je voulais éviter

    Regarde :

    Create or replace Function add_truc (RefTruc VarChar2,truc2 VarChar2,truc3 Varchar2)
    Return number is
    Begin
    Insert into Tablevalues
    SELECT auto_Ref.nextVal,Reftruc,truc2,Truc3 FROM dual;
    Return auto_Ref.Currval;
    End;
    /
    ATTENTION j'ai fait une erreur, on ne peux pas retourner currval directement, il faut passer par un SELECT

    Et toi tu tapes :

    Create or replace Function add_question (RefQuest VarChar2,TextQ VarChar2,TypeQ Varchar2)
    Return number is
    Begin
    Insert into Question (idquestion,refquestionnaire,text,typereponse)
    values
    (select auto_RefQuestion.nextVal, RefQuest,TextQ,TypeQ);
    Return auto_RefQuestion.CurVal;
    End;
    /
    c'est SELECT ou VALUES mais pas les 2 et un select s'appuie forcément sur quelque chose, ici DUAL qui est une pseudo table

    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Create or replace Function add_question (RefQuest VarChar2,TextQ VarChar2,TypeQ Varchar2)
    Return number is
    ret number;
    Begin
       Insert into Question (idquestion,refquestionnaire,text,typereponse)
        values (auto_RefQuestion.nextVal, RefQuest,TextQ,TypeQ );   
     
       SELECT auto_RefQuestion.CurVal
       INTO ret FROM DUAL;
     
       Return ret;
    End;
    /
    Attention à bien lire les réponses

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par orafrance
    c'est justement ce que je voulais éviter
    Pourquoi ? Quelle en est la raison ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Après vérification, ma proposition ne marche pas

    currval et nextval ne peuvent être utilisé que dans un SELECT, UPDATE ou INSERT

    au temps pour moi

    C'est donc Plainer qui a raison

    EDIT : j'ai corrigé mes bêtises

  10. #10
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Si tu veux, tu peux aussi utiliser la clause RETURN :

    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
     
    SQL> create or replace function p_insert return number as
      2     ret number;
      3  begin
      4     insert into TEST(x) values(seq.nextVal) return x into ret;
      5     return ret;
      6  end;
      7  /
     
    Function created.
     
    SQL> var ret number;
    SQL> exec :ret := p_insert;
     
    PL/SQL procedure successfully completed.
     
    SQL> print ret;
     
           RET
    ----------
            21
     
    SQL> select seq.currVal from dual;
     
       CURRVAL
    ----------
            21
    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    là c'est la classe

  12. #12
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Ouais c'est pour briller en société


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    La, c'est carrement Nickel!!!

    Un Enorme Merci

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut [Debutant] Procedure ou fonction PL/QSL
    Bonjour,
    J'ai deja poser pas mal de question sur ce forum concernant mon problème mais je ne m'en tire toujours pas...
    Je veux inserer un element dans une table contenant un champ qui "s'auto incrémente" via une sequence. J'ai besoin de connaitre le numero qui a été attribué a l'enregistrement apres son insertion depuis le programme qui utilise cette table pour continuer le traitement. C'est là qu'est mon problème:
    - Si je cré une procedure stockée: je ne peux pas retourner la valeur courrante de la sequence vers mon interface,
    - Si je cré une procedure, je ne peux pas appeler le INSERT car j'y ferai appel depuis mon interface par un truc du genre 'Select mafonction (params) from dual'

    Bref je suis dans le mur...

    AU SECOUR avant que je fasse le insert a la main depuis l'interface puis un select la_clé de l'élément que je viens d'inserer...

    Merci

  15. #15
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Tu peux peut être utiliser une fonction qui joue une transaction autonome :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    SQL> create table TEST1(y number);
     
    Table created.
     
    SQL> create sequence seq;
     
    Sequence created.
     
    SQL> ed
    Wrote file afiedt.buf
     
      1  create or replace function f return number as
      2     pragma autonomous_transaction;
      3     ret number;
      4  begin
      5     insert into TEST1 values(seq.nextVal) returning y into ret;
      6     commit;
      7     return ret;
      8* end;
    SQL> /
     
    Function created.
     
    SQL> select f from dual;
     
             F
    ----------
             1
     
    SQL> /
     
             F
    ----------
             2
     
    SQL> /
     
             F
    ----------
             3
     
    SQL> select * from TEST1;
     
             Y
    ----------
             1
             2
             3
     
    SQL>
    Du coup tu peux faire le COMMIT alors que la fonction est appelée dans un select...


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  16. #16
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Merci de ne pas recréer de nouveau sujet. Il serait bien plus constructif de nous expliquer ce qui ne convient pas dans la proposition qui t'as été faite

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Ben apparament, je ne dois pas avoir les droits car lorsque je tappe ed dans SQL Plus j'ai le message:
    SP2-0110: Impossible de créer un fichier de sauvegarde "afiedt.buf"
    Merci de ton aide

  18. #18
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 135
    Points
    3 135
    Par défaut
    pour changer le repertoire de afiedt.buf
    tu peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL>set editfile <repertoire>/afiedt.buf

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Désolé,
    J'avais entamé une nouvelles discussion car la solution qui était donnée était bien mais je m'étais mal poser le problème (j'avais demandé de l'aide sur une fonction et je ne suis plus sûr que ce soit une fonction qu'il faille...) Donc je pensais qu'il était plus clair de repartir de rien. Mais c'est vrai que le mettre a la suite est bien aussi.
    En tous cas, Merci de votre aide :o

  20. #20
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Citation Envoyé par jesus144
    Ben apparament, je ne dois pas avoir les droits car lorsque je tappe ed dans SQL Plus j'ai le message:
    SP2-0110: Impossible de créer un fichier de sauvegarde "afiedt.buf"
    Merci de ton aide
    Euh désolé, il faut juste taper les requêtes, le ed sous sql*plus c'est parce que je m'étais planté dans ma requête et je l'ai édité.


    Voici le code de la function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create or replace function f return number as
       pragma autonomous_transaction;
       ret number;
    begin
       insert into TEST1 values&#40;seq.nextVal&#41; returning y into ret;
       commit;
       return ret;
    end;

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comparaison Procedures stockees - Fonctions
    Par k'n1 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/06/2006, 07h31
  2. Réponses: 9
    Dernier message: 30/03/2006, 17h44
  3. creation d'une procedure ou fonction toute simple?
    Par atlas2003 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 16/11/2005, 15h56
  4. procedure ou fonction de conversion
    Par arezki76 dans le forum Oracle
    Réponses: 2
    Dernier message: 14/11/2005, 16h36
  5. Procedures et fonctions
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 09/05/2004, 00h47

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