PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 24/09/2018 15:05:05

Douk V5
Banni(e)

Passage de paramètre dynamique dans le Crosstab?

Salut,

J'ai un souci. Ma requête fonction très bien quand la valeur de mon param est passé en dûr mais me renvoie cette erreur
quand je place le paramètre pour la dynamiser.

C vrai que suis dans un outil de reporting(JasperReports) donc je suis un peu habitué.


L'indice de la colonne est hors limite : 5, nombre de colonnes : 4.

Le probleme viens de là.


Juste le squelette du SQL


SELECT
....
FROM CROSSTAB (
$$ SELECT 
...
FROM sh.invoice
WHERE
to_char(DateAcct,'YYYY') =$P{YEAR}
ORDER by invoice_id $$,
...

Comment le resoudre svp?



Cordialement,
Douk V5

Dernière modification par Douk V5 (24/09/2018 15:16:12)

Hors ligne

#2 24/09/2018 18:03:21

dverite
Membre

Re : Passage de paramètre dynamique dans le Crosstab?

Du point de vue du SQL toute la partie entre $$ et $$ est une chaîne de caractères en dur. S'il y  un paramètre $P{YEAR} il est doit être interprété par l'outil côté client et sa valeur doit être injectée dans la chaîne avant de la passer au moteur SQL.


Au vu de l'erreur ce n'est pas comme ça que l'outil procède, il semble vouloir un "vrai" paramètre au sens des requêtes paramétrées au niveau SQL.


Il est possible d'en faire un vrai paramètre mais il faudrait le sortir de la chaîne litérale et la découper en 3 parties avec un syntaxe du style:

concat($$ SELECT ... WHERE to_char(DateAcct,'YYYY') = $$ , $P{YEAR}, $$ ORDER BY ... $$)

Hors ligne

#3 26/09/2018 13:57:43

Douk V5
Banni(e)

Re : Passage de paramètre dynamique dans le Crosstab?

Merci @dverite



Sa marche

Hors ligne

#4 09/10/2018 11:40:53

Douk V5
Banni(e)

Re : Passage de paramètre dynamique dans le Crosstab?

dverite a écrit :

Du point de vue du SQL toute la partie entre $$ et $$ est une chaîne de caractères en dur. S'il y  un paramètre $P{YEAR} il est doit être interprété par l'outil côté client et sa valeur doit être injectée dans la chaîne avant de la passer au moteur SQL.


Au vu de l'erreur ce n'est pas comme ça que l'outil procède, il semble vouloir un "vrai" paramètre au sens des requêtes paramétrées au niveau SQL.


Il est possible d'en faire un vrai paramètre mais il faudrait le sortir de la chaîne litérale et la découper en 3 parties avec un syntaxe du style:

concat($$ SELECT ... WHERE to_char(DateAcct,'YYYY') = $$ , $P{YEAR}, $$ ORDER BY ... $$)

Salut,
Encore un peu coincé. J'essais de gérer un paramètre optionnel $P{Customer_ID} avec la même procédure et je n'y arrive pas.
Du genre AND Customer_ID= $P{Customer_ID} OR $P{Customer_ID}  IS NULL

concat($$ SELECT ... WHERE to_char(DateAcct,'YYYY') = $$ , $P{YEAR}, $$  ORDER BY ... $$
                     AND Customer_ID= $$ , $P{Customer_ID} , $$ OR $$ ,$P{Customer_ID} IS NULL , $$ ORDER BY ... $$)

Une idée svp ?


Cordialement

Hors ligne

#5 09/10/2018 13:52:47

dverite
Membre

Re : Passage de paramètre dynamique dans le Crosstab?

Le problème est que si $P{Customer_ID} se présente comme une chaîne vide, le résultat SQL va ressembler à
...Customer_ID = OR IS NULL...
ce qui est syntaxiquement doublement faux du point de vue de l'interpréteur SQL.

Mais est-ce que c'est ça qui se produit? Par quoi exactement $P{Customer_ID}  est remplacé?
Par '' (chaîne vide mais litéral SQL valide)?
Par rien du tout?
Par le mot-clef NULL?

Hors ligne

#6 09/10/2018 14:29:34

Douk V5
Banni(e)

Re : Passage de paramètre dynamique dans le Crosstab?

dverite a écrit :

Le problème est que si $P{Customer_ID} se présente comme une chaîne vide, le résultat SQL va ressembler à
...Customer_ID = OR IS NULL...
ce qui est syntaxiquement doublement faux du point de vue de l'interpréteur SQL.

Mais est-ce que c'est ça qui se produit? Par quoi exactement $P{Customer_ID}  est remplacé?
Par '' (chaîne vide mais litéral SQL valide)?
Par rien du tout?
Par le mot-clef NULL?

Salut @dverite,


D'après ma compréhension mon parametre $P{Customer_ID} doit être remplacé par NULL.
Cmt je pourai donc l'écrire stp??


C'est vraiment la première fois que je suis confronté à ce type de problème.


Merci pr ton assistance.

Hors ligne

#7 09/10/2018 15:51:21

dverite
Membre

Re : Passage de paramètre dynamique dans le Crosstab?

Mais quelle est l'erreur qui se produit avec la combinaison OR....AND ? C'est une erreur de syntaxe ou c'est pas le bon résultat?
Quel est le message d'erreur s'il y en a un?

Si c'est syntaxiquement correct il doit manquer des parenthèses puisque le AND précède le OR dans l'ordre d'évaluation.

Hors ligne

#8 09/10/2018 16:22:19

Douk V5
Banni(e)

Re : Passage de paramètre dynamique dans le Crosstab?

Erreur de syntaxe:


Caused by: org.postgresql.util.PSQLException: ERROR: Argument of AND must have type boolean, not type sh.invoice

Même avec les parathèse

concat($$ SELECT ... WHERE to_char(DateAcct,'YYYY') = $$ , $P{YEAR}, $$  ORDER BY ... $$
                     AND (Customer_ID= $$ , $P{Customer_ID} , $$ OR $$ ,$P{Customer_ID} IS NULL , $$) ORDER BY ... $$)
 

Cordialement,

Dernière modification par Douk V5 (09/10/2018 16:23:46)

Hors ligne

#9 09/10/2018 16:49:09

dverite
Membre

Re : Passage de paramètre dynamique dans le Crosstab?

Le ORDER BY n'a pas le droit d'être à cette place (dans la clause where), et la partie $$ OR $$ ,$P{Customer_ID} IS NULL , $$ doit aussi être découpée pour que $P{Customer_ID}  soit tout seul en dehors de la chaîne de caractères.

Ce qui serait intéressant c'est d'avoir toute la requête telle qu'elle arrive à postgres, elle doit être dans le log postgresql si elle n'est pas dans le message d'erreur.

Hors ligne

#10 09/10/2018 17:05:34

Douk V5
Banni(e)

Re : Passage de paramètre dynamique dans le Crosstab?

Ok je vais bosser dessus et revoir mon code sql si possible.


Merci

Hors ligne

Pied de page des forums