Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1845 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°583885
Evadream -​jbd-
Posté le 05-12-2003 à 16:42:23  profilanswer
 

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
mood
Publicité
Posté le 05-12-2003 à 16:42:23  profilanswer
 

n°583917
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:06:29  profilanswer
 

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é.
n°583925
Evadream -​jbd-
Posté le 05-12-2003 à 17:13:59  profilanswer
 

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
n°583929
Evadream -​jbd-
Posté le 05-12-2003 à 17:19:46  profilanswer
 

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
n°583935
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:29:49  profilanswer
 

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é.
n°583939
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:35:01  profilanswer
 

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é.
n°583941
Evadream -​jbd-
Posté le 05-12-2003 à 17:35:28  profilanswer
 

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 ?

n°583945
Evadream -​jbd-
Posté le 05-12-2003 à 17:39:03  profilanswer
 

[: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é.

n°583946
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:39:38  profilanswer
 

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é.
n°583949
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:41:41  profilanswer
 

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é.
mood
Publicité
Posté le 05-12-2003 à 17:41:41  profilanswer
 

n°583954
Evadream -​jbd-
Posté le 05-12-2003 à 17:43:39  profilanswer
 


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
n°583958
Mara's dad
Yes I can !
Posté le 05-12-2003 à 17:51:53  profilanswer
 

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é.
n°583961
Evadream -​jbd-
Posté le 05-12-2003 à 17:57:49  profilanswer
 

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

n°583962
Evadream -​jbd-
Posté le 05-12-2003 à 17:58:04  profilanswer
 

Ca change rien, tjs la meme erreur :/

n°583963
Mara's dad
Yes I can !
Posté le 05-12-2003 à 18:02:35  profilanswer
 

Manque un ; avant le IF :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°583968
Evadream -​jbd-
Posté le 05-12-2003 à 18:30:15  profilanswer
 

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

n°583969
Mara's dad
Yes I can !
Posté le 05-12-2003 à 18:32:06  profilanswer
 

Remontre ton code...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°583970
Evadream -​jbd-
Posté le 05-12-2003 à 18:36:25  profilanswer
 


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' ;
 

n°583973
Mara's dad
Yes I can !
Posté le 05-12-2003 à 18:38:41  profilanswer
 

@IdClasse ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°583975
Evadream -​jbd-
Posté le 05-12-2003 à 18:43:50  profilanswer
 

: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 !

n°583984
Evadream -​jbd-
Posté le 05-12-2003 à 18:57:29  profilanswer
 

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
n°584008
Mara's dad
Yes I can !
Posté le 05-12-2003 à 19:31:27  profilanswer
 

Je ne sais pas !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[postgresql] trigger, j'ai du malTuning Postgresql - Tips
[Postgresql] Transaction : équivalent à @@error en sql server ?[PostgreSQL] phpPgAdmin, probleme de creation de table o_O
problème de création de fonction avec postgresql 7.3.4Syntaxe SQL
J'ai un problème avec easyphp 1.7 (syntaxe php)[MySQL] Erreur de syntaxe que je ne comprend pas ! (aléatoire en plus)
postgresql : afficher toutes les tables, je ne trouve pas dans la docdifférence entre postgresql et mysql [résolu merci]
Plus de sujets relatifs à : [postgresql/pgsql] IF - THEN - ELSE, syntaxe particulière ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR