Vous n'êtes pas identifié(e).
Pages : 1
Bonjour!
Je viens de commencer à créer les procédures stockées avec PLPGSQL et j'ai un problème lors de l'insertion dans une table.En effet j'ai créer une procédure stockée qui permet des insertions dans la table emprunt mais avant contrôle si le stock des livre le permet et si un étudiant qui aurait déjà fait un emprunt n'en fait pas un autre. NB: la table Emprunt est une table 'fille' des table etudiant et Livre. J'ai réussi à exécuter la procédure mais quand je tape la commande select InsereDans_Emprunt (1,'145623145','1245635','',1,1); j'ai le message suivant: ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne « codeemprunt »
CONTEXT: instruction SQL « INSERT INTO EMPRUNT values (NCodeEmprunt, NDateEmprunt, NDateSuppR, NDateEffR,NMatricule, NCodeLivre) »
PL/pgSQL function "insererdans_emprunt" line 80 at instruction SQL
Je vous prie de m'aider s'il vous plaît.
Ci dessous voici le script du sous programme en question:
CREATE OR REPLACE FUNCTION insererdans_emprunt(integer, character varying, character varying, character varying, integer, integer)
RETURNS record AS
$BODY$
declare
NcodeEmprunt integer;
NControleNbreLiv Integer;
NControleMaxCodeEmp Integer;
NCodeLivre integer;
NMatricule integer;
NDateEmprunt varchar;
NdateSuppR varchar;
NdateEffR varchar;
Begin
SELECT into NControleNbreLiv NbreExemplaire
FROM LIVRE
WHERE CodeLivre = Ncodelivre;
SELECT into NControleMaxCodeEmp Count(CodeEmprunt)
FROM EMPRUNT
WHERE Matricule = NMatricule
AND DateEffR = null;
IF (
(NControleMaxCodeEmp > 0) OR
(NControleNbreLiv = 0)
) then
Raise notice 'nombre de livre insuffisant';
ELSE
IF (
SELECT count(*)
FROM EMPRUNT
) = 0 then
Begin
NMatricule := 1;
UPDATE LIVRE
SET NbreExemplaire = NbreExemplaire - 1
WHERE CodeLivre = Ncodelivre;
End;
ELSE
Begin
SELECT into NCodeEmprunt MAX(CodeEmprunt)
FROM EMPRUNT;
NCodeEmprunt := NCodeEmprunt + 1;
UPDATE LIVRE
SET NbreLivre = NbreLivre - 1
WHERE CodeLivre = Ncodelivre;
End;
End If;
End If;
INSERT INTO EMPRUNT values (NCodeEmprunt, NDateEmprunt, NDateSuppR, NDateEffR,NMatricule, NCodeLivre);
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION insererdans_emprunt(integer, character varying, character varying, character varying, integer, integer) OWNER TO postgres;
Hors ligne
J'ai l'impression que le INSERT INTO a la fin n'est pas bien positionné dans les ELSE. Du coup si il passe dans le IF avec l'update j'ai l'impression qu'il execute quand même le insert derrière. La variable NCodeEmprunt n'étant pas instancier il essaye le INSERT avec null.
Hors ligne
Exact. Et j'en profite pour dire que les BEGIN et END sont inutiles (en dehors de ceux de début et fin de procédure).
Guillaume.
Hors ligne
Pages : 1