Vous n'êtes pas identifié(e).
Pages : 1
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
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
Merci @dverite
Sa marche
Hors ligne
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
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
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
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
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
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
Ok je vais bosser dessus et revoir mon code sql si possible.
Merci
Hors ligne
Pages : 1