[postgresql/pgsql] IF - THEN - ELSE, syntaxe particulière ?

IF - THEN - ELSE, syntaxe particulière ? [postgresql/pgsql] - SQL/NoSQL - Programmation

Marsh Posté le 05-12-2003 à 16:42:23    

Hello, j'ai le nez dans la doc depuis plusieurs heures, mais je m'en sors pas :
 


CREATE FUNCTION AjoutReservation (
    integer,
 integer,
 integer,
 integer,
 integer
) returns void as '
 
 
declare
 V_IdVol             alias for $1  ;
 V_IdClient          alias for $2  ;
 V_IdTypeDeplacement alias for $3  ; -- ligne 15
 V_IdLieuReservation alias for $4  ;
 V_IdClasse         alias for $5  ;
 
 
begin  
 
begin work ;
 
 IF    (
         SELECT  count(*)  
   From  Reservations r
   WHERE IdVol = V_IdVol  AND IdClasse = V_IdClasse ;
   )
   
     
  <  
   
   (  
   SELECT  sum(NbrPlaceClasse)  
   From  Vols v
    INNER JOIN Appareils a ON a.IdAppareil = v.IdAppareil
    INNER JOIN ClassesTypesAppareil cta ON cta.IdTypeAppareil = a.IdTypeAppareil and cta.IdClasse = V_IdClasse  
   WHERE v.IdVol = V_IdVol ;
   )  
   
 THEN  
   raise notice \'THEN\' ;
   commit ;
   return ;
 ELSE
   raise notice \'ELSE\' ;
 END IF ;
 
 commit ;
 return ;
 
end ; '
language 'plpgsql' ;


 
L'erreur est la suivante :
 


=> select AjoutReservation(0,0,0,0,0) ;
ERROR:  syntax error at or near ""
CONTEXT:  compile of PL/pgSQL function "ajoutreservation" near  
line 15
=>


 
J'essaye de faire qqchose d'impossible ?
 
Merci à vous, @+


Message édité par Evadream -jbd- le 05-12-2003 à 16:45:00
Reply

Marsh Posté le 05-12-2003 à 16:42:23   

Reply

Marsh Posté le 05-12-2003 à 17:06:29    

C'est quoi "begin work" ?
 
Le caractère d'échapemment pour ' c'est pas '' au lieu de \' ?
 
select AjoutReservation(0,0,0,0,0) ;
Ta fonction est déclarée en "returns void". Tu attends quoi dans le select ?
 
http://cfeweb1/pgsql_doc/plpgsql-declarations.html


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:13:59    

begin work > début d'une transaction non ?
Pour le caractère d'échappement, je pense que c'est ca, je vais vérifier. Mais j'ai fait un if ... then return ; et ca fait la même chose.
 
Je n'attends rien dans le select, c'est juste pour tester ma fonction en fait =)


Message édité par Evadream -jbd- le 05-12-2003 à 17:24:43
Reply

Marsh Posté le 05-12-2003 à 17:19:46    

J'ai essayé d'épurer afin d'y voir plus clair, j'ai enlevé les trucs qui me semblaient non sûrs :
 


CREATE FUNCTION AjoutReservation (
    integer,
 integer,
 integer,
 integer,
 integer
) returns void as '
 
 
declare
 V_IdVol             alias for $1  ;
 V_IdClient          alias for $2  ;
 V_IdTypeDeplacement alias for $3  ;
 V_IdLieuReservation alias for $4  ;
 V_IdClasse         alias for $5  ;
 res1 integer ;
 res2   integer ;
 
begin  
 
begin work ;
 
  res1 := SELECT  count(*)  
      From  Reservations r
      WHERE IdVol = V_IdVol  and IdClasse = V_IdClasse ;
       
  res2 := SELECT  count(*)  
      From  Vols v, Appareils a, ClassesTypesAppareil cta -- ligne 30
      WHERE v.IdVol = V_IdVol and a.IdAppareil = v.IdAppareil and cta.IdTypeAppareil = a.IdTypeAppareil and cta.IdClasse = V_IdClasse ;
 
 IF    res1 < res 2      
 THEN commit ; return;
 END IF ;
 commit ;
 return ;
 
end ; '
language 'plpgsql' ;


 
L'erreur se situe vers la ligne 30.  
Je me suis rendu sur un equivalent de ta page (http://www.postgresql.org/docs/current/static/plpgsql-declarations.html), je l'avais déja parcouru, mais je le fais une fois de plus, j'ai sans doute oublié quelque chose, merci !


Message édité par Evadream -jbd- le 05-12-2003 à 17:21:29
Reply

Marsh Posté le 05-12-2003 à 17:29:49    

J'ai toujours un doute su le begin work !
Y'a 2 begin et un seul end...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:35:01    

Citation :

"It is important not to confuse the use of BEGIN/END for grouping statements in  
PL/pgSQL with the database commands for transaction control. PL/pgSQL's BEGIN/END are  
only for grouping; they do not start or end a transaction. Functions and trigger  
procedures are always executed within a transaction established by an outer query ---  
they cannot start or commit transactions, since PostgreSQL does not have nested  
transactions."


 
http://www.mail-archive.com/pgsql- [...] 12011.html
 
En plus, normalement, une transaction c'est entre BEGIN WORK et COMMIT WORK.
 
Bon çà c'était pour postgres 7.2. Je sais pas pour les plus récentes.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:35:28    

Il me semble que le begin work est lié aux commit/rollback que tu peux recontrer après. En tout cas, dans le bouquin que je feuillete en plus de la doc sur internet, c'est comme ca qu'il font. Je pense qu'il faut de toute facon un mot clé , comment ferait-on pour différencier une transaction d'une procédure stockée ?

Reply

Marsh Posté le 05-12-2003 à 17:39:03    

[:ddr555] Je viens de lire ton post... Ca chamboule un peu tout ce que j'avais mis en place :D :D  
 
En gros, il faut que j'entoure l'appel de ma fonction par un begin work et un commit work afin d'arriver à mes fins, c ca ?
 
Merci pour le temps que tu m'as consacré.

Reply

Marsh Posté le 05-12-2003 à 17:39:38    

T'as pas compris :
Une fonction s'éxécute déjà DANS une transaction. Et comme postgresql ne permet pas les transactions imbriquée (en 7.2 en tout cas), ben forcément, tu peut pas faire un begin work dans une fonction.
EDIT : Bon, çà y est t'as appris à lire :D


Message édité par Mara's dad le 05-12-2003 à 17:40:19

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:41:41    

Evadream -jbd- a écrit :

[:ddr555] En gros, il faut que j'entoure l'appel de ma fonction par un begin work et un commit work afin d'arriver à mes fins, c ca ?


J'en sais rien, mais je ne pense pas !
Il semble qu'il y ait Implicitement une transaction quand tu appelles une fonction...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:41:41   

Reply

Marsh Posté le 05-12-2003 à 17:43:39    


drop function AjoutReservation(integer, integer, integer, integer, integer) ;
 
CREATE FUNCTION AjoutReservation (
    integer,
 integer,
 integer,
 integer,
 integer
) returns void as '
 
 
declare
 V_IdVol             alias for $1  ;
 V_IdClient          alias for $2  ;
 V_IdTypeDeplacement alias for $3  ;
 V_IdLieuReservation alias for $4  ;
 V_IdClasse         alias for $5  ;
 res1 integer ;
 res2   integer ;
 
begin  
 
  res1 := SELECT  count(*)  
      FROM  Reservations r
      WHERE IdVol = V_IdVol  and IdClasse = V_IdClasse ;  
       
  res2 := SELECT  count(*)  
      FROM  Vols v
         INNER JOIN Appareils a ON a.IdAppareil = v.IdAppareil -- ligne 30
                INNER JOIN ClassesTypesAppareil cta ON cta.IdTypeAppareil = a.IdTypeAppareil and cta.IdClasse = @IdClasse
        WHERE v.IdVol = V_IdVol  
 IF    res1 < res 2      
 THEN return ;
 END IF ;
 return ;
 
 
end ; '
language 'plpgsql' ;
 


 
Tjs une erreur vers la ligne 30 :/ :D ;) :'|


Message édité par Evadream -jbd- le 05-12-2003 à 17:44:12
Reply

Marsh Posté le 05-12-2003 à 17:51:53    

La ligne 30, à mon avis, c'est plutôt le "IF    res1 < res 2"
parce-que je pense qu'il prends en compte la ligne 1 au niveaux du CREATE FUNCTION
 
En fait y'a bien une erreur : y'a un espace entre "res" et "2" :D
 
Bon en plus, moi je l'écrirais comme çà :

Code :
  1. IF res1 < res2 THEN
  2.     return;
  3. END IF;



---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 17:57:49    

! L'espace, you're right; shame on me.

Reply

Marsh Posté le 05-12-2003 à 17:58:04    

Ca change rien, tjs la meme erreur :/

Reply

Marsh Posté le 05-12-2003 à 18:02:35    

Manque un ; avant le IF :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 18:30:15    

Bah dis donc... :/
Ca fait tjs la même chose :D

Reply

Marsh Posté le 05-12-2003 à 18:32:06    

Remontre ton code...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 18:36:25    


drop function AjoutReservation(integer, integer, integer, integer, integer) ;
 
CREATE FUNCTION AjoutReservation (
    integer,
 integer,
 integer,
 integer,
 integer
) returns void as '
 
 
declare
 V_IdVol             alias for $1  ;
 V_IdClient          alias for $2  ;
 V_IdTypeDeplacement alias for $3  ;
 V_IdLieuReservation alias for $4  ;
 V_IdClasse         alias for $5  ;
 res1 integer ;
 res2   integer ;
 
begin  
 
  res1 := SELECT  count(*)  
      FROM  Reservations r
      WHERE IdVol = V_IdVol  and IdClasse = V_IdClasse ;
       
  res2 := SELECT  count(*)  
      FROM  Vols v
         INNER JOIN Appareils a ON a.IdAppareil = v.IdAppareil
                INNER JOIN ClassesTypesAppareil cta ON cta.IdTypeAppareil = a.IdTypeAppareil and cta.IdClasse = @IdClasse
        WHERE v.IdVol = V_IdVol ;
 IF    res1 < res2      
 THEN return ;
 END IF ;
 return ;
 
 
end ; '
language 'plpgsql' ;
 

Reply

Marsh Posté le 05-12-2003 à 18:38:41    

@IdClasse ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-12-2003 à 18:43:50    

:D :D :D
 
Bon, ca marche tjs pas, mais je vais me prendre une pause, parce que je ne vois plus rien, alors que ce sont des erreurs que je pourrais voir moi même...
 
Je te tiens au courant, et merci !

Reply

Marsh Posté le 05-12-2003 à 18:57:29    

Je suis désolé de demander tout le temps plein de trucs, je suis sur plusieurs front en même temps et j'ai vraiment du mal à tomber sur l'information qui m'interesse :/
 
Comment je peux faire pour faire des select, insert into ... à partir d'une autre base locale qui aurait comme nom essai2 apr exemple ?
 
J'ai entreapercu en SQL serveur la syntaxe suivante :
 

INSERT INTO [Essai2].dbo.MaTable ....


 
y'a t'il un équivalent ?


Message édité par Evadream -jbd- le 05-12-2003 à 18:59:37
Reply

Marsh Posté le 05-12-2003 à 19:31:27    

Je ne sais pas !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed