2009-03-02 8 views
1

Est-il possible de rendre dynamique le nom du schéma dans une requête BIRT?Nom du schéma dynamique BIRT 2.2

J'ai essayé ceci:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY' 
     END) AS DAYOFWEEK 
FROM **?**.COBOL_CALENDAR 
WHERE SERVICE_DATE = CURRENT DATE" 

Cela génère l'erreur suivante: Les éléments suivants ont des erreurs:

ReportDesign (id = 1): 
+ Cannot get the result set metadata. 
SQL statement does not return a ResultSet object. 
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N An unexpected token "?" was found following "". Expected tokens may include: "(TABLE FINAL <IDENTIFIER> XMLTABLE". SQLSTATE=42601 

Mais? semble seulement fonctionner pour la clause where.

Je dois passer le schéma comme param et utiliser de façon dynamique car elle change en fonction dev/cat/prod

est-il pas un moyen de genereate sql outsite du xml BIRT et l'injecter en quelque sorte ??

j'ai fait un peu plus de recherche sur le sujet et trouvé cette solution

<method name="beforeOpen"><![CDATA[this.queryText = "SELECT CURRENT DATE AS DATE, "+ 
"(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'"+ 
"  WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'"+ 
"  END) AS DAYOFWEEK"+ 
"FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+ 
" WHERE SERVICE_DATE = CURRENT DATE";]]></method> 

Cependant, peu importe combien d'exemples qui sont là sur cette question sql injection de cette manière ne génère que l'erreur suivante.

ReportDesign (id = 1): 
+ Cannot get the result set metadata. 
SQL statement does not return a ResultSet object. 
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N An unexpected token "SCHEMANAME" was found following "". Expected tokens may include: ", FROM INTO". SQLSTATE=42601 

J'ai même essayé la voie reportContext.getParameterValue("SCHEMANAME") avec les mêmes résultats.

Répondre

2

ARRRGH c'était un problème stupide avec des espaces !!

"END) AS DAYOFWEEK" + "de "+ params [" SCHEMA"] + "COBOL_CALENDAR" +

Ajout d'un espace devant le fixe à partir de lui.

tête de bang sur l'affichage à cristaux liquides.

0

On dirait que vous avez modifié la source XML de votre rapport. Voici une façon plus graphique de faire le remplacement d'une chaîne arbitraire dans votre requête SQL:

Écrivez votre requête comme suit:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY' 
     WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY' 
     END) AS DAYOFWEEK 
FROM dev.COBOL_CALENDAR 
WHERE SERVICE_DATE = CURRENT DATE 

Si dev est un schéma valide, vous êtes en mesure de choisir le méta-ensemble de données et sont toujours en mesure de le remplacer par un paramètre de rapport.

Cliquez ensuite sur votre jeu de données et sélectionnez l'onglet "Script". Ici vous sélectionnez « beforeOpen » et entrez le ccript de remplacement:

this.queryText = this.queryText.replace("dev", params["SCHEMA"].value); 

De cette façon, vous remplacez la chaîne dev dans le texte de votre requête avec la valeur de votre paramètre SCHEMA avant d'exécuter la requête. Vous pouvez remplacer chaque chaîne souhaitée (linke **?** de votre question, mais avec un schéma valide en premier lieu, vous pouvez utiliser le méta-ensemble de données pour la phase de conception.) enter image description here