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

Langage SQL Discussion :

Petite question sur les procédures stockées


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 56
    Points : 46
    Points
    46
    Par défaut Petite question sur les procédures stockées
    Bonjour, je suis en DUT Informatique et j'ai une question sur les procédures stockées.

    Quand on fait à l'intérieur de la procédure des DBMS_OUTPUT.PUT_LINE, ces affichages ne sont pas effectués car la procédure ne renvoie qu'une valeur mais comment puis-je néanmoins voir ces affichages ?

    Voici ma procédure :
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    CREATE OR REPLACE PROCEDURE ajout_match (pIdMatch match.idMatch%TYPE, pDateM match.dateM%TYPE, pIdEqLoc match.idEqLoc%TYPE, pIdEqVis match.idEqVis%TYPE, pTypeComp typeComp.idComp %TYPE, retour OUT NUMBER)
    AS
    CURSOR jouEqLoc IS SELECT idJoueur FROM joueur WHERE idEq = pIdEqLoc;
    CURSOR jouEqVis IS SELECT idJoueur FROM joueur WHERE idEq = pIdEqVis;
    --Variables de traitement
    i        NUMBER ;
    v_test        VARCHAR (15) ;
    --Exceptions
    idMatch_present    EXCEPTION;
    PRAGMA EXCEPTION_INIT (idMatch_present, -00001);
    idEqLoc_idEqVis_equal    EXCEPTION;
    idEq_match        EXCEPTION;
    periode_match        EXCEPTION;
    match_joue        EXCEPTION;
    nbJoueur_max         EXCEPTION ;
     
    BEGIN
    -- Ajout du match
     
    -- Test si l’équipe locale entrée existe
    i := 1;
    SELECT idEq INTO v_test FROM equipe WHERE idEq = pIdEqLoc;
     
    -- Test si l’équipe visiteuse entrée existe
    i := 2;
    SELECT idEq INTO v_test FROM equipe WHERE idEq = pIdEqVis;
     
    -- Test si le type de compétition entré existe
    i := 3;
    SELECT idComp INTO v_test FROM typeComp WHERE idComp = pTypeComp;
     
    -- Test si l’équipe locale et l’équipe visiteuse sont les mêmes
    IF pIdEqLoc  = pIdEqVis THEN 
    RAISE idEqLoc_idEqVis_equal;
    END IF;
     
    --Test si les équipes ne jouent pas deux matchs le même jour
    SELECT COUNT(*) INTO i FROM match WHERE TO_CHAR (dateM,'DD/MM/YY') LIKE TO_CHAR(pDateM,'DD/MM/YY') AND dateM IN  (SELECT dateM FROM match WHERE idEqLoc = pIdEqLoc OR idEqVis = pIdEqVis OR idEqLoc = pIdEqVis OR idEqVis = pIdEqLoc); 
    IF i != 0 THEN
    RAISE idEq_match;
    END IF;
     
    --Test si le match est joué dans la période Septembre-Juin
    IF TO_CHAR (pDateM, 'MM') = '07' OR TO_CHAR (pDateM, 'MM') = '08' THEN
        RAISE periode_match;
    END IF ;
     
    --Test si le match à déjà eu lieu dans la saison
    SELECT COUNT (*) INTO i FROM match WHERE idEqLoc = pIdEqLoc AND idEqVis = pIdEqVis AND TO_CHAR (dateM,'YY') LIKE TO_CHAR(pDateM,'YY');
    IF  i != 0 THEN
            RAISE  match_joue ;
    END IF ;
     
    --Test du nombre de joueurs valides
    SELECT COUNT (*) INTO i FROM joueur WHERE idEq = pIdEqLoc AND estValide =  'o' ;
    IF i > 22 THEN
    RAISE nbJoueur_max ;
    END IF ;
     
    SELECT COUNT (*) INTO i FROM joueur WHERE idEq = pIdEqVis AND estValide =  'o' ;
    IF i > 22 THEN
    RAISE nbJoueur_max ;
    END IF ;
     
    INSERT INTO match VALUES (pIdMatch, pDateM, 0, 0, pIdEqLoc, pIdEqVis, pTypeComp);
    DBMS_OUTPUT.PUT_LINE ('Ajout du match n° ' || pIdMatch || ' du '  || pDateM || ' effectue dans la table match');
     
     
    -- Ajout des couples match-joueur (équipe visiteuse)
    FOR jouEqVis_ligne IN jouEqVis LOOP
    INSERT INTO matchjoueur VALUES (jouEqVis_ligne.idJoueur, pIdMatch, 0, 0, 0,'');
    DBMS_OUTPUT.PUT_LINE ('Joueur visiteur '|| jouEqVis_ligne.idJoueur || ' ajouté dans la table matchJoueur');
    END LOOP; 
     
    -- Ajout des couples match-joueur (équipe locale)
    FOR jouEqLoc_ligne IN jouEqLoc LOOP
    INSERT INTO matchjoueur VALUES (jouEqLoc_ligne.idJoueur, pIdMatch, 0, 0, 0,'');
    DBMS_OUTPUT.PUT_LINE ('Joueur local '|| jouEqLoc_ligne.idJoueur || ' ajouté dans la table matchJoueur');
    END LOOP;
     
        COMMIT;
        DBMS_OUTPUT.PUT_LINE ('Transaction effectuée');
        retour := 0;
        RETURN (retour);
     
    EXCEPTION
     
     
     
        WHEN idMatch_present THEN
        DBMS_OUTPUT.PUT_LINE ('Le numéro de match que vous tentez d''ajouter existe déjà.');
        retour := 1;
     
        WHEN NO_DATA_FOUND THEN
        IF i = 1 THEN 
    DBMS_OUTPUT.PUT_LINE ('L''identifiant de l''équipe locale que vous tentez d''ajouter est inconnu.');
    retour := 2;
    END IF;
     
    IF i = 2 THEN 
    DBMS_OUTPUT.PUT_LINE ('L''identifiant de l''équipe visiteuse que vous tentez d''ajouter est inconnu.');
    retour := 3;
    END IF;
     
    IF i = 3 THEN 
    DBMS_OUTPUT.PUT_LINE ('Le type de competition que vous tentez d''ajouter est inconnu.');
    retour := 4;
    END IF;
     
    WHEN idEqLoc_idEqVis_equal THEN
    DBMS_OUTPUT.PUT_LINE ('L''équipe locale et l''équipe visiteuse que vous tentez d''ajouter sont les mêmes .');
    retour := 5;
     
    WHEN idEq_match THEN
    DBMS_OUTPUT.PUT_LINE ('Les equipes ne peuvent pas jouer deux matchs le même jour.');
    retour := 6;
     
    WHEN periode_match THEN
    DBMS_OUTPUT.PUT_LINE ('Le match doit se jouer dans la période Septembre-Juin.');
    retour := 7;
     
    WHEN match_joue THEN
    DBMS_OUTPUT.PUT_LINE ('Le match opposant ces deux equipes à déjà eu lieu.');
    retour := 8;
     
    WHEN nbJoueur_max  THEN
    DBMS_OUTPUT.PUT_LINE ('Le nombre maximal de joueurs à été atteint.');
    retour := 9;
     
    END;
    /

    Merci d'avance pour vos réponses.

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,

    - C'est une question ORACLE PL/SQL

    - N'hésitez pas à utiliser les balises CODE

    - Pouvez-vous préciser la question, je ne comprends pas bien le problème :
    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
     
    SQL> set serveroutput on
    SQL> 
    SQL> create or replace procedure toto(retour out VARCHAR2) as
      2  BEGIN
      3  dbms_output.put_line('TOTO');
      4  retour := 'TITI';
      5  end;
      6  /
     
    Procédure créée.
     
    SQL> 
    SQL> declare
      2  TITI VARCHAR2(4);
      3  begin
      4  toto(TITI);
      5  dbms_output.put_line(TITI);
      6  end;
      7  /
    TOTO
    TITI
     
    Procédure PL/SQL terminée avec succès.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 56
    Points : 46
    Points
    46
    Par défaut
    En clair lorsque j'exécute ma procédure (sous sqlplus) elle ne me renvoie que la valeur de retour et je souhaiterais savoir comment visualiser les affichages :

    Exécution de ma procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE 
    ret NUMBER;
     
    BEGIN
    ajout_match ('&idMatch', '&dateM', '&idEqLoc', '&idEqVis', '&typeComp', ret);
    END;
    Je reposte le 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
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    CREATE OR REPLACE PROCEDURE ajout_match (pIdMatch match.idMatch%TYPE, pDateM match.dateM%TYPE, pIdEqLoc match.idEqLoc%TYPE, pIdEqVis match.idEqVis%TYPE, pTypeComp typeComp.idComp %TYPE, retour OUT NUMBER)
    AS
    CURSOR jouEqLoc IS SELECT idJoueur FROM joueur WHERE idEq = pIdEqLoc;
    CURSOR jouEqVis IS SELECT idJoueur FROM joueur WHERE idEq = pIdEqVis;
    --Variables de traitement
    i		NUMBER ;
    v_test		VARCHAR (15) ;
    --Exceptions
    idMatch_present	EXCEPTION;
    PRAGMA EXCEPTION_INIT (idMatch_present, -00001);
    idEqLoc_idEqVis_equal	EXCEPTION;
    idEq_match		EXCEPTION;
    periode_match		EXCEPTION;
    match_joue		EXCEPTION;
    nbJoueur_max 		EXCEPTION ;
     
    BEGIN
    -- Ajout du match
     
    -- Test si l’équipe locale entrée existe
    i := 1;
    SELECT idEq INTO v_test FROM equipe WHERE idEq = pIdEqLoc;
     
    -- Test si l’équipe visiteuse entrée existe
    i := 2;
    SELECT idEq INTO v_test FROM equipe WHERE idEq = pIdEqVis;
     
    -- Test si le type de compétition entré existe
    i := 3;
    SELECT idComp INTO v_test FROM typeComp WHERE idComp = pTypeComp;
     
    -- Test si l’équipe locale et l’équipe visiteuse sont les mêmes
    IF pIdEqLoc  = pIdEqVis THEN 
    RAISE idEqLoc_idEqVis_equal;
    END IF;
     
    --Test si les équipes ne jouent pas deux matchs le même jour
    SELECT COUNT(*) INTO i FROM match WHERE TO_CHAR (dateM,'DD/MM/YY') LIKE TO_CHAR(pDateM,'DD/MM/YY') AND dateM IN  (SELECT dateM FROM match WHERE idEqLoc = pIdEqLoc OR idEqVis = pIdEqVis OR idEqLoc = pIdEqVis OR idEqVis = pIdEqLoc); 
    IF i != 0 THEN
    RAISE idEq_match;
    END IF;
     
    --Test si le match est joué dans la période Septembre-Juin
    IF TO_CHAR (pDateM, 'MM') = '07' OR TO_CHAR (pDateM, 'MM') = '08' THEN
    	RAISE periode_match;
    END IF ;
     
    --Test si le match à déjà eu lieu dans la saison
    SELECT COUNT (*) INTO i FROM match WHERE idEqLoc = pIdEqLoc AND idEqVis = pIdEqVis AND TO_CHAR (dateM,'YY') LIKE TO_CHAR(pDateM,'YY');
    IF  i != 0 THEN
    		RAISE  match_joue ;
    END IF ;
     
    --Test du nombre de joueurs valides
    SELECT COUNT (*) INTO i FROM joueur WHERE idEq = pIdEqLoc AND estValide =  'o' ;
    IF i > 22 THEN
    RAISE nbJoueur_max ;
    END IF ;
     
    SELECT COUNT (*) INTO i FROM joueur WHERE idEq = pIdEqVis AND estValide =  'o' ;
    IF i > 22 THEN
    RAISE nbJoueur_max ;
    END IF ;
     
    INSERT INTO match VALUES (pIdMatch, pDateM, 0, 0, pIdEqLoc, pIdEqVis, pTypeComp);
    DBMS_OUTPUT.PUT_LINE ('Ajout du match n° ' || pIdMatch || ' du '  || pDateM || ' effectue dans la table match');
     
     
    -- Ajout des couples match-joueur (équipe visiteuse)
    FOR jouEqVis_ligne IN jouEqVis LOOP
    INSERT INTO matchjoueur VALUES (jouEqVis_ligne.idJoueur, pIdMatch, 0, 0, 0,'');
    DBMS_OUTPUT.PUT_LINE ('Joueur visiteur '|| jouEqVis_ligne.idJoueur || ' ajouté dans la table matchJoueur');
    END LOOP; 
     
    -- Ajout des couples match-joueur (équipe locale)
    FOR jouEqLoc_ligne IN jouEqLoc LOOP
    INSERT INTO matchjoueur VALUES (jouEqLoc_ligne.idJoueur, pIdMatch, 0, 0, 0,'');
    DBMS_OUTPUT.PUT_LINE ('Joueur local '|| jouEqLoc_ligne.idJoueur || ' ajouté dans la table matchJoueur');
    END LOOP;
     
    	COMMIT;
    	DBMS_OUTPUT.PUT_LINE ('Transaction effectuée');
    	retour := 0;
    	RETURN (retour);
     
    EXCEPTION
     
     
     
    	WHEN idMatch_present THEN
    	DBMS_OUTPUT.PUT_LINE ('Le numéro de match que vous tentez d''ajouter existe déjà.');
    	retour := 1;
     
    	WHEN NO_DATA_FOUND THEN
    	IF i = 1 THEN 
    DBMS_OUTPUT.PUT_LINE ('L''identifiant de l''équipe locale que vous tentez d''ajouter est inconnu.');
    retour := 2;
    END IF;
     
    IF i = 2 THEN 
    DBMS_OUTPUT.PUT_LINE ('L''identifiant de l''équipe visiteuse que vous tentez d''ajouter est inconnu.');
    retour := 3;
    END IF;
     
    IF i = 3 THEN 
    DBMS_OUTPUT.PUT_LINE ('Le type de competition que vous tentez d''ajouter est inconnu.');
    retour := 4;
    END IF;
     
    WHEN idEqLoc_idEqVis_equal THEN
    DBMS_OUTPUT.PUT_LINE ('L''équipe locale et l''équipe visiteuse que vous tentez d''ajouter sont les mêmes .');
    retour := 5;
     
    WHEN idEq_match THEN
    DBMS_OUTPUT.PUT_LINE ('Les equipes ne peuvent pas jouer deux matchs le même jour.');
    retour := 6;
     
    WHEN periode_match THEN
    DBMS_OUTPUT.PUT_LINE ('Le match doit se jouer dans la période Septembre-Juin.');
    retour := 7;
     
    WHEN match_joue THEN
    DBMS_OUTPUT.PUT_LINE ('Le match opposant ces deux equipes à déjà eu lieu.');
    retour := 8;
     
    WHEN nbJoueur_max  THEN
    DBMS_OUTPUT.PUT_LINE ('Le nombre maximal de joueurs à été atteint.');
    retour := 9;
     
    END;
    /

  4. #4
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Avez-vous bien activé la sortie ?

    La procédure compile avec ça ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 56
    Points : 46
    Points
    46
    Par défaut
    Effectivement erreur bête je n'ai pas activé la sortie. Merci bcp

    Oui elle compile sans erreur, elle ne devrait pas ???

  6. #6
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Citation Envoyé par Jobard81 Voir le message
    Oui elle compile sans erreur, elle ne devrait pas ???
    Contrairement à une fonction une procédure ne renvoie rien.
    Normalement à la compilation vous devriez avoir
    Error(9,1): PLS-00372: L'instruction RETURN ne peut pas contenir d'expression dans une procédure.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 56
    Points : 46
    Points
    46
    Par défaut
    Oui, désolé je n'avais pas dû compiler la bonne version de ma procédure.
    En tout cas merci pour vos réponses. Bonne journée

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2009, 14h57
  2. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  3. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  4. Informations sur les procédures stockées
    Par jfphan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/01/2004, 14h30
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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