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 :

Problème de paramètre dans une procédure stockée


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut Problème de paramètre dans une procédure stockée
    Bonsoir,
    Je suis pas doué en Oracle c'est ma première utilisant et je galère un peu
    J'ai besoin de créer une procédure stocké en utilisant oracle qui permet de retourner la liste des soignant dans la spécialité passée en paramètre ayant rédigé plus que 40 prescriptions le mois en cours.


    voila ce que j'ai fais mais ca ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE PROCEDURE LISTESOIGNANT (Pspecialite in VARCHAR) IS
    BEGIN
      SELECT * FROM SOIGNANT WHERE specialite=Pspecialite   numsoignant in (SELECT numsoignant FROM prescription where MONTH(SYSDATE) =MONTH(prescription.dateprescription) GROUP BY numsoignant HAVING COUNT(numsoignant)>=40);
    END LISTESOIGNANT;
    Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 731
    Points : 1 172
    Points
    1 172
    Par défaut
    Bonjour,

    En PL/SQL, il faut que tu places le résultat de la requête quelque part. Soit dans une table, soit dans un curseur, soit dans une collection. Voici un exemple, en utilisant un curseur système, pour par exemple passer le résultat de ta procédure à une application :

    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 procedure listesoignant(Pspecialite in varchar2, p_donnees OUT SYS_REFCURSOR) is
    begin
     
     open p_donnees for
     select * from soignant s
     where s.specialite = Pspecialite
       and exists (select 1 from prescription p
                        where p.numsoignant = s.numsoignant
    		       and p.dateprescription >= trunc(sysdate, 'mm')
    		    having count(*) >= 40
    		   );
     
    end listesoignant;
    /

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut
    C'est super ca fonctionne merci. Cependant j'ai deux question s'il te plait la première en attendant que quelqu'un me répond j'ai trouvé qu'il faut stocké le résultat quelque part ou utiliser l'instruction EXECUTE IMMEDIATE c'est quoi la différence?
    Ma deuxième question je souhaite récupérer le résultat de la procédure dans un Jtable en java le faite d'utiliser un curseur ca va pas etre compliquer a récupérer? et merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 731
    Points : 1 172
    Points
    1 172
    Par défaut
    EXECUTE IMMEDIATE sert à exécuter une instruction de manière dynamique et les instructions qui ne peuvent pas l'être directement en pl/sql (tronquer une table, altérer la session, etc.)
    Pour du SQL dynamique, ca servira typiquement si le nom des tables à interroger n'est pas connu d'avance. Cela dit, il est rarement nécessaire d'utiliser EXECUTE IMMEDIATE à cette fin car logiquement les tables sont connues. C'est le cas pour toi, tes tables existent et tu n'as donc pas besoin d'utiliser EXECUTE IMMEDIATE.
    L'utilisation d'un refcursor est justement ce qu'il faut utiliser pour du Java, même si tu peux aussi utiliser une collection. Regarde sur cette page tu as un exemple pour du Java:

    https://oracle-base.com/articles/mis...ng-ref-cursors

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut
    Merci c'est ce qu'il me faut

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut
    Excuse moi de revenir mais j'ai une question pourquoi tu as mis Select 1? et j'ai un petit soucis si j'exécute la procédure sa affiche le soignant sans problème par contre une fois je rajoute a la table prescription un autre soignant dans la même spécialité je suis obligé de modifier 1 par * et ainsi de suite sinon j'ai pas tout les soignant comme si le cursor ne s'actualise pas. Tu as une idée pourquoi?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 731
    Points : 1 172
    Points
    1 172
    Par défaut
    Bonjour,
    Le 1 c'est juste pour sélectionner qqch pour le exists, ça n'a aucune importance si tu mets 1, null ou *, ce qui compte c'est le test d'existence dans la clause where de la condition EXISTS. Si tu ajoutes un soignant alors que ta procédure tourne alors non tu ne le ramènera pas. Il faut que tu relances ta procédure après que ton soignant a été ajouté dans la table prescription.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut
    Bonjour,

    D'accord,l'appel de la procédure par l'objet CallableStatement qui permet d'alimenté mon Jtable ne relance pas la procédure?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 731
    Points : 1 172
    Points
    1 172
    Par défaut
    Non, la procédure va ramener les données au moment où tu l'exécutes. Si tu veux avoir les données au fil de l'eau il faut faire en sorte que ta procédure soit exécutée de manière répétée avec un job ou une tâche planifiée.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2011
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2011
    Messages : 157
    Points : 79
    Points
    79
    Par défaut
    d'accord je vais chercher à ce niveau merci pour les clarifications

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/10/2008, 16h29
  2. Réponses: 1
    Dernier message: 06/03/2007, 11h57
  3. Réponses: 1
    Dernier message: 20/07/2006, 17h03
  4. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  5. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45

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