Vous n'êtes pas identifié(e).

#1 28/05/2015 11:55:39

thalienne
Membre

Problème d'insertion dans la table

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

#2 28/05/2015 14:43:09

mtcocktail
Administrateur

Re : Problème d'insertion dans la table

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

#3 28/05/2015 18:53:00

gleu
Administrateur

Re : Problème d'insertion dans la table

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

Pied de page des forums