Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 24/09/2018 15:05:05
- Douk V5
- Membre
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 ... $$)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#3 26/09/2018 13:57:43
- Douk V5
- Membre
Re : Passage de paramètre dynamique dans le Crosstab?
Merci @dverite
Sa marche
Hors ligne
#4 09/10/2018 11:40:53
- Douk V5
- 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 ... $$)
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?
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#6 09/10/2018 14:29:34
- Douk V5
- 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?
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#8 09/10/2018 16:22:19
- Douk V5
- Membre
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#10 09/10/2018 17:05:34
- Douk V5
- Membre
Re : Passage de paramètre dynamique dans le Crosstab?
Ok je vais bosser dessus et revoir mon code sql si possible.
Merci
Hors ligne
Pages : 1