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

SQL Oracle Discussion :

Appel de procédure stockée depuis une procédure stockée


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut Appel de procédure stockée depuis une procédure stockée
    Bonjour,

    alors le titre explique tout à fait ce que je veux,
    je voudrais appeler une procédure stockée depuis une autre procédure stockée, tout ça dans la même base oracle.
    J'ai essayé les quelques syntaxes trouvées sur internet mais j'ai toujours des erreurs.
    "Error(13,8): PLS-00103: Encountered the symbol "SELECTSERVICE" when expecting one of the following: := . ( @ % ; The symbol ":=" was substituted for "SELECTSERVICE" to continue. "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BEGIN
     call SELECTSERVICE(libelleService);
    merci bien

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    sans le call ça ira mieux

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    ah oui en effet, j'y ai meme pas pensé.

    en même temps comment ne pas être paumé avec des gars qui disent n'imp sur les sites pour apprendre ==>
    Les procédures stockées peuvent être appelées au moyen de l'instruction EXECUTE (SQL Server) ou CALL (Oracle) à partir d'une autre procédure ou d'un lot d'instructions
    et merci à toi

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    tu devrais savoir que le seul site de référence c'est Developpez.com

    http://sheikyerbouti.developpez.com/...age=Chap4#L4.1

    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
    SQL> CREATE OR REPLACE PROCEDURE Test_Augmentation
      2     (
      3       PN$Numemp IN EMP.empno%Type
      4      ,PN$Pourcent IN OUT NUMBER
      5     ) IS
      6     LN$Salaire EMP.sal%Type ;
      7  BEGIN
      8      Select sal Into LN$Salaire From EMP Where empno = PN$Numemp ;
      9      -- augmentation virtuelle de l'employé
     10      PN$Pourcent := LN$Salaire * PN$Pourcent ;
     11  END;
     12  /
     
    Procédure créée.
    SQL> select empno, sal from emp where empno = 7369 ;
     
         EMPNO        SAL
    ---------- ----------
          7369        880
     
    SQL> Declare
      2    LN$Pourcent NUMBER := 1.1 ;
      3  Begin
      4    Test_Augmentation( 7369, LN$Pourcent ) ;
      5    dbms_output.put_line( 'Employé 7369 après augmentation : ' || To_char( LN$Pourcent ) ) ;
      6  End ; 
      7  /
    Employé 7369 après augmentation : 968

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    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
    CREATE OR REPLACE
    PROCEDURE SELECTABONNES 
    (
     nom XABO.NOMABO%type,
     prenom XABO.PNOMABO%type,
     telephone XABO.TELABO%type,
     libelleService XSCE.LBLSCE%type
    )
    AS
     
    abo XABO.NUMABO%type;
    service XABO.SCEABO%type;
     
    BEGIN
      SELECT NUMABO
      INTO abo
      FROM XABO 
      WHERE NOMABO = nom 
      AND PNOMABO = prenom
      AND SCEABO = SELECTSERVICE(libelleService);
    EXCEPTION
      WHEN no_data_found THEN
            BEGIN
              INSERT INTO XABO (NUMABO, NOMABO, PNOMABO, TELABO, SCEABO)
              VALUES (sequence.nextval, nom, prenom, telephone, service);
            END; 
     
    END SELECTABONNES;
    Alors que la syntaxe est exactement la meme qu'une des procédures que j'ai ecrite et fonctionne, celle-ci pose problème.
    Error(14,3): PL/SQL: SQL Statement ignored
    Error(19,16): PL/SQL: ORA-00904: : invalid identifier
    puisses-tu m'aider ^^

    edit : apparemment, il aimes pas qu'on appelle une procédure stockée depuis n'importe où. Peut-on affecter une procédure stockée a une variable, et où faut-il le faire?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SCEABO = SELECTSERVICE(libelleService);
    si SELECTSERVICE n'est pas une fonction ça ne peux pas marcher. Merci de lire le tutoriel PL/SQL

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Donc on peut APPELER des procédures stockées, mais quand on les appelle on ne peut pas les utiliser...vive SQL Server!!!!!!

    et la FAQ j'ai tout lu et rien ne m'aide

    j'ai mis ma procédure stockée en fonction, j'ai ca, mais qu'est ce que je mets dans le INTO?
    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
    CREATE OR REPLACE FUNCTION SELECTSERVICE (libelleService XSCE.LBLSCE%type)
    RETURN XSCE.NUMSCE%type
    AS
      BEGIN
      SELECT NUMSCE
      INTO 
      FROM XSCE 
      WHERE LBLSCE = libelleService;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
          BEGIN
          INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (sequence.nextval, libelleService);
          END;
    END SELECTSERVICE;

  8. #8
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Si tu veux que ta proc te retourne quelquechose, crée une fonction au lieu d'une procedure...

    Crée une variable pour ton INTO.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    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
    CREATE OR REPLACE
    FUNCTION SELECTSERVICE (libelleService XSCE.LBLSCE%type)
    RETURN XSCE.NUMSCE%type
     
    service XSCE.NUMSCE%type;
    AS
      BEGIN
      SELECT NUMSCE
      INTO service
      FROM XSCE 
      WHERE LBLSCE = libelleService;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
          BEGIN
          INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (sequence.nextval, libelleService);
          END;
    END SELECTSERVICE;
    j'arrive pas à la créér cette variable, il me jette. Peux tu me dire où je le fais.

    je persiste...oracle vs SQL Server, le choix est fait

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par marcusien
    Donc on peut APPELER des procédures stockées, mais quand on les appelle on ne peut pas les utiliser...vive SQL Server!!!!!!
    une procédure qui retourne une valeur c'est une variable... avant de critiquer tu ferais bien de relire le tutoriel qui décrit précisément la différence entre les 2 et comment s'en servir

  11. #11
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Regarde ton code et réfléchit un peu, à savoir si ta déclaration de variable est placée au bon endroit dans le corps de ta fonction.

    Et sache qu'Oracle est beaucoup plus puissant, intéressant... que SQL Server...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par davy.g
    Et sache qu'Oracle est beaucoup plus puissant, intéressant... que SQL Server...
    Pas du tout

    Merci d'éviter les trolls d'un coté comme de l'autre

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    je crois que je m'en suis sorti...
    laborieux.

    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
    CREATE OR REPLACE
    FUNCTION SELECTSERVICE (libelleService XSCE.LBLSCE%type)
    RETURN XSCE.NUMSCE%type
    AS
    service XSCE.NUMSCE%type;
     
      BEGIN
      SELECT NUMSCE
      INTO service
      FROM XSCE 
      WHERE LBLSCE = libelleService;
      return service;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
          BEGIN
          INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (sequence.NEXTVAL, libelleService);
     
          SELECT NUMSCE
          INTO service
          FROM XSCE 
          WHERE LBLSCE = libelleService;
          return service; 
          END;
    END SELECTSERVICE;
    désolé de passer pour un Kevin mais ca fait un mois que je penche sur le meme problème, alors que ca soit oracle qui me fasse perdre du temps

    merci à vous deux

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par Fred_D
    Pas du tout

    Merci d'éviter les trolls d'un coté comme de l'autre
    Hum...oui parce que SQL Server est tout aussi puissant ^^

    moi qui déteste le troll, désolé d'avoir posté des betises, mais c'est que sous Oracle la syntaxe est bien particulière et c'est parfois assez laborieux.

    Regarde ton code et réfléchit un peu, à savoir si ta déclaration de variable est placée au bon endroit dans le corps de ta fonction.
    Dans le corps de ma fonction, en SQL server ca passerait, excuse moi d'etre qu'un débutant sous Oracle

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    note que ta fonction plantera toujours dans le cas d'un NO_DATA_FOUND puisque tu exécutes la même requête dans l'EXCEPTION

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    hmmm...ben normalement elle dois pas planter.

    en fait, j'ai un active directory, des personnes qui font parti d'un service.
    je rentre d'abord le service dans une table. MAIS, si le service n'existe pas, je l'insère dans ma table (donc ca c'est dans mon EXCEPTION NO_DATA_FOUND)
    Ensuite, vu qu'il est dans la base (car je l'ai inséré), je vais récupérer l'identifiant du service pour pouvoir ensuite insérer la personne dans une autre table que j'affecterai au service que j'ai inséré.

    Donc normalement ca ne devrais pas planter

    sinon je pensais rappeler après cette même fonction.

    En gros : J'éxécute une fois ma fonction, si le service n'existe pas, je le créé, et une fois créé, je relance la fonction.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Alors remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          SELECT NUMSCE
          INTO service
          FROM XSCE 
          WHERE LBLSCE = libelleService;
          RETURN service;
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT sequence.CURRVAL
          INTO service
          FROM XSCE;
    RETURN(service);
    Voir même (mais là je ne suis pas sûr )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURN(sequence.CURRVAL)

  18. #18
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Fred_D
    Alors remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          SELECT NUMSCE
          INTO service
          FROM XSCE 
          WHERE LBLSCE = libelleService;
          RETURN service;
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT sequence.CURRVAL
          INTO service
          FROM XSCE;
    RETURN(service);
    Voir même (mais là je ne suis pas sûr )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURN(sequence.CURRVAL)
    Euh.. non le SELECT sequence from XSCE.. too many rows.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WHEN NO_DATA_FOUND THEN
          BEGIN
     
    SELECT sequence.NEXTVAL
          INTO service
          FROM DUAL;
     
    INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (service, libelleService);
     
          RETURN service; 
          END;

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    from dual en effet, copier/coller pas bon


  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Merci bien, c'est exactement ce que je cherchais à faire : récupérer le numéro généré par la séquence mais le Sequence.curval fonctionnait pas donc j'avais juste fais comme ça (ce qui fonctionnait également très bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHEN NO_DATA_FOUND THEN
          BEGIN
     
          INSERT INTO XSCE (NUMSCE, LBLSCE)
          VALUES (sequence.nextval, libelleService);
          return SELECTSERVICE(libelleService);
          END;
    en sachant que SELECTSERVICE est le nom de ma fonction ;-)

    C'est gentil de m'avoir aidé

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

Discussions similaires

  1. Affichier une image stockée depuis une BDD Mysql
    Par Paul75 dans le forum Développement iOS
    Réponses: 0
    Dernier message: 18/01/2015, 20h05
  2. Réponses: 3
    Dernier message: 30/12/2008, 09h33
  3. Réponses: 7
    Dernier message: 18/01/2008, 18h01
  4. Réponses: 3
    Dernier message: 28/08/2007, 15h21
  5. Réponses: 4
    Dernier message: 26/04/2007, 09h03

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