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 :

erreur dans ma procedure


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut erreur dans ma procedure
    Bonsoir tout le monde j ai créer la procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace procedure procedure_stokees(v_patient patient.idpatient%type)
    is 
    begin 
    select nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure 
    from  patient join sejourne using (IDPATIENT) where idpatient=v_patient;
    end procedure_stokees;
    /
    et j ai reçu ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vertissement : ProcÚdure crÚÚe avec erreurs de compilation.
    et quand je met show error :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Erreurs pour PROCEDURE PROCEDURE_STOKEES :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/1      PLS-00428: une clause INTO est attendue dans cette instruction
             SELECT
    pouvez vous m expliquer pour quoi il me dise qu'il faut une clause into sachant que je veux afficher pour un patient donné le nombre de séjour effectuer
    merci d avance

  2. #2
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Tu ne peux pas afficher directement dans une procédure PL/SQL
    Tu peux faire une sortie VIA dbms_output.
    Pour cela, il te faut des variables !
    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 procedure procedure_stokees(v_patient patient.idpatient%type) IS 
     v_nom patient.nom%type;
     v_prenom patient.prenom%type;
     v_jours NUMBER; 
      begin  
    SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure 
    into v_nom,v_prenom,v_jours
    FROM  patient JOIN sejourne 
    ON  patient.id_patient=sejourne.id_patient
    WHERE idpatient=v_patient;
    DBMS_OUTPUT.PUT_LINE (v_nom||','||v_prenom||'->'||v_jours);
     end procedure_stokees;

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    bonjour j ai tester mais il m affiche ce message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Avertissement : ProcÚdure crÚÚe avec erreurs de compilation.
     
    SQL> show error;
    Erreurs pour PROCEDURE PROCEDURE_STOKEES :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    6/1      PL/SQL: SQL Statement ignored
    9/24     PL/SQL: ORA-00904: "SEJOURNE"."ID_PATIENT" : identificateur non
             valide
    même si on a écrit (patient.id_patient=sejourne.id_patient) ??

  4. #4
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    test d'abord ta requete (sans le INTO) dans SQLPlus.

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Citation Envoyé par Garuda Voir le message
    test d'abord ta requete (sans le INTO) dans SQLPlus.
    ça marche sans into mais avec cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure 
    FROM  patient JOIN sejourne using (IDPATIENT)
    WHERE idpatient=&v_patient;
    Entrez une valeur pour v_patient : 1
    ancien   3 : WHERE idpatient=&v_patient
    nouveau   3 : WHERE idpatient=1
     
    NOM          PRENOM       NBR_SEJOURE
    ------------ ------------ -----------
    karim     tazzi              19
    par contre avec cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure 
    FROM  patient JOIN sejourne 
    ON  patient.IDPATIENT=sejourne.IDPATIENT
    WHERE idpatient=&v_patient;
    il y a une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR Ó la ligne 4 :
    ORA-00918: dÚfinition de colonne ambigu

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le messages d'erreur répond pourtant parfaitement à votre interrogation :
    ERREUR Ó la ligne 4
    On va à la ligne 4 de votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE idpatient=&v_patient;
    On reprend le message d'erreur :
    ORA-00918: dÚfinition de colonne ambigu
    Oracle ne sait pas de quelle table idpatient fait parti dans votre WHERE.

  7. #7
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Donc
    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 procedure procedure_stokees(v_patient patient.idpatient%type) IS  
    v_nom patient.nom%type; 
    v_prenom patient.prenom%type;
    v_jours NUMBER;   
    begin  
    SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure 
    into v_nom,v_prenom,v_jours
    FROM  patient JOIN sejourne 
    ON patient.idpatient=sejourne.idpatient
    WHERE idpatient=v_patient;
    DBMS_OUTPUT.PUT_LINE (v_nom||','||v_prenom||'->'||v_jours); 
    end procedure_stokees;

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Perdu, c'est la ligne du dessous !

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le messages d'erreur répond pourtant parfaitement à votre interrogation :

    On va à la ligne 4 de votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE idpatient=&v_patient;
    On reprend le message d'erreur :


    Oracle ne sait pas de quelle table idpatient fait parti dans votre WHERE.
    idpatient fait partie des deux table (patient et sejourne )
    moi je travail toujours avec (join using) ,et ça a marché bien sur, j té montrer le résultat!
    et avec votre manier, si logique puisque vous avais fait (patient.IDPATIENT=sejourne.IDPATIENT)
    (dans ma bdd idpatient est la clé primaire de la table patient et la clé socondaire de la table sejourne)

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Re

    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
     
    SQL> CREATE OR REPLACE procedure procedure_stokees(
      2   v_patient in  patient.idpatient%type,
      3   v_nom out patient.nom%type,
      4   v_prenom out patient.prenom%type,
      5   v_jours out  NUMBER)
      6      is
      7     begin
      8      SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure
      9      into v_nom,v_prenom,v_jours
     10      FROM  patient JOIN sejourne using (IDPATIENT)
     11      WHERE idpatient=&v_patient;
     12      DBMS_OUTPUT.PUT_LINE (v_nom||','||v_prenom||'->'||v_jours);
     13      end procedure_stokees;
     14     /
    Entrez une valeur pour v_patient : 1
    ancien  11 :     WHERE idpatient=&v_patient;
    nouveau  11 :     WHERE idpatient=1;
     
    ProcÚdure crÚÚe.
    voila maintenant ça marche mais comment afficher le résultat de cette procedure ??
    et est ce que (in out) sont obligatoire dans les variables ?
    merci pour votre soutien

  11. #11
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    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
    CREATE OR REPLACE procedure procedure_stokees(v_patient patient.idpatient%type) IS
     v_nom patient.nom%type; 
     v_prenom patient.prenom%type;
     v_jours NUMBER;
    begin
      SELECT nom, prenom, (DATESORTIE- DATEENTREE) nbr_sejoure
     into   v_nom,v_prenom,v_jours
     FROM  patient JOIN sejourne
     ON patient.idpatient=sejourne.idpatient
    WHERE patient.idpatient=v_patient;
    DBMS_OUTPUT.PUT_LINE (v_nom||','||v_prenom||'->'||v_jours);
     end procedure_stokees;
    1) ne pas utiliser &v_patient mais la variable v_patient
    2) faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BEGIN procedure_stockee(&v_patient); END;
    3) Lire un peu de littérature sur le SQL et le PL/SQL !!!!!!

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Pour que dbms_output affiche quelque chose:
    Pur lancer la procedure:
    Les in out sont mis a IN par defaut.

    Le select my_proc from dual ne fonctionne pas. Il faut une fonction.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    TMP>PROMPT ==Type par defaut est IN:
    ==Type par defaut est IN:
    TMP>create or replace procedure my_proc (a number) is
      2  begin
      3  dbms_output.put_line(a);
      4  a:=2;
      5  dbms_output.put_line(a);
      6  end;
      7  /
     
    Warning: Procedure created with compilation errors.
     
    Elapsed: 00:00:00.00
    TMP>
    TMP>show errors
    Errors for PROCEDURE MY_PROC:
     
    LINE/COL ERROR                                                                                                                                                                                                                                                                                                                                                                                                  
    -------- -----------------------------------------------------------------                                                                                                                                                                                                                                                                                                                                      
    4/1      PL/SQL: Statement ignored                                                                                                                                                                                                                                                                                                                                                                              
    4/1      PLS-00363: expression 'A' cannot be used as an assignment target                                                                                                                                                                                                                                                                                                                                       
    TMP>
    TMP>create or replace procedure my_proc (a number) is
      2  begin
      3  dbms_output.put_line(a);
      4  end;
      5  /
     
    Procedure created.
     
    Elapsed: 00:00:00.02
    TMP>
    TMP>PROMPT ==exec my_proc fonctionne:
    ==exec my_proc fonctionne:
    TMP>exec my_proc(42)
    42                                                                                                                                                                                                                                                                                                                                                                                                              
     
    PL/SQL procedure successfully completed.
     
    Elapsed: 00:00:00.00
    TMP>
    TMP>PROMPT ==Select procedure from dual ne fonctionne pas:
    ==Select procedure from dual ne fonctionne pas:
    TMP>select my_proc(-2) from dual;
    select my_proc(-2) from dual
           *
    ERROR at line 1:
    ORA-00904: "MY_PROC": invalid identifier 
     
     
    Elapsed: 00:00:00.00
    TMP>
    TMP>create or replace function my_func return number is
      2  begin
      3  dbms_output.put_line(27);
      4  return 42;
      5  end;
      6  /
     
    Function created.
     
    Elapsed: 00:00:00.01
    TMP>PROMPT En revanche, on fait un select my_function from dual
    En revanche, on fait un select my_function from dual
    TMP>select my_func from dual;
     
       MY_FUNC                                                                                                                                                                                                                                                                                                                                                                                                      
    ----------                                                                                                                                                                                                                                                                                                                                                                                                      
            42                                                                                                                                                                                                                                                                                                                                                                                                      
     
    27                                                                                                                                                                                                                                                                                                                                                                                                              
    Elapsed: 00:00:00.00
    TMP>
    TMP>drop procedure my_proc;
     
    Procedure dropped.
     
    Elapsed: 00:00:00.07
    TMP>drop function my_func;
     
    Function dropped.
     
    Elapsed: 00:00:00.02
    TMP>spool off
    Relire la littérature sur le SQL et PL/SQL

  13. #13
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Le select my_proc from dual ne fonctionne pas. Il faut une fonction.
    Tu as dégainé plus vite que ton ombre !

    J'ai effectivement corrigé et remplacé par un bloc PL/SQL anonyme.

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Lucky luke
    Ah ca, c'est parce que la pause d'avant la pause cafe c'est developpez.

Discussions similaires

  1. erreur dans une procedure
    Par younes86 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 20/01/2010, 09h33
  2. [Sql server 2000] gerer les erreurs dans une procedure
    Par lemagicien dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/03/2008, 21h15
  3. Erreur dans procedure stockées
    Par freud dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2007, 11h13
  4. erreur dans l'execution de procedure
    Par obydissonn dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/06/2007, 10h47
  5. Erreur Dans Procedure Pl/sql
    Par Redwings dans le forum PL/SQL
    Réponses: 5
    Dernier message: 07/11/2006, 15h40

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