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;
/ |
Partager