BIRT 2.2 dynamischer Schemaname
Frage
Ist es möglich, die Schemanamen dynamisch in einer BIRT Abfrage zu machen.
Ich habe versucht, dies:
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"
Dies erzeugt die folgenden Fehler: Folgende Artikel haben Fehler:
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
Aber das? nur scheint für die where-Klausel zu arbeiten.
Ich brauche das Schema als param passieren und verwenden dynamisch, weil es auf dev / cat / prod basierend ändert
gibt es nicht eine Möglichkeit, SQL outsite der birt xml genereate und injizieren es irgendwie ??
Ich habe zu diesem Thema einig weitere Suche und fand diese Lösung
<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>
Doch unabhängig davon, wie viele Beispiele, die es zu diesem Thema sind auf diese Weise der Injektion SQL nur die folgende Fehlermeldung generiert.
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
Ich habe sogar versucht die reportContext.getParameterValue("SCHEMANAME")
Route mit dem gleichen Ergebnis.
Lösung
ARRRGH es ist ein dummes Problem mit Leerzeichen !!
"END) AS DAYOFWEEK" + "FROM "+ params [" SCHEMA"] + "COBOL_CALENDAR" +
Das Hinzufügen eines Raumes vor der FROM es festgelegt.
Pony Kopf auf dem LCD-Display.
Andere Tipps
Sieht aus wie die bearbeitete XML-Quelle des Berichts. Hier ist eine grafische Art und Weise den Austausch einer beliebigen Zeichenkette in der SQL-Abfrage zu tun:
Schreiben Sie eine Abfrage wie folgt:
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
Wenn dev
ein gültiges Schema sind Sie nun in der Lage, die Meta-Daten-Set zu wählen und sind noch in der Lage mit einem Berichtsparameter zu ersetzen.
Klicken Sie dann auf Ihre Daten-Set und wählen Sie das „Skript“ Tab. Hier wählen Sie „Before“ und geben Sie den Ersatz ccript:
this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);
Auf diese Weise können die String dev
in der Abfrage Text mit dem Wert Ihres SCHEMA
ersetzen Parameter, bevor Sie die Abfrage ausführen. Sie könnten jeden String Sie wollen (linken **?**
aus Ihrer Frage, aber mit einem gültigen Schema in erster Linie ersetzen können Sie die Meta-Daten-Set für die Designphase verwendet werden.