質問
BIRTクエリでスキーマ名を動的にすることは可能ですか。
これを試しました:
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"
これにより、次のエラーが生成されます。 次の項目にエラーがあります:
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
しかし? where句でのみ機能するようです。
スキーマをパラメータとして渡し、dev / cat / prodに基づいて変化するため、動的に使用する必要があります
birt xmlの外部のSQLを生成し、何らかの方法で挿入する方法はありませんか?
この件についてさらに検索を行い、この解決策を見つけました
<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>
ただし、この方法でsqlを挿入すると、この問題に関するサンプルの数に関係なく、次のエラーのみが生成されます。
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
reportContext.getParameterValue(&quot; SCHEMANAME&quot;)
ルートを試しても同じ結果が得られました。
解決
ARRRGHそれはスペースの愚かな問題でした!!
&quot;終了)DAYOFWEEK&quot; + &quot; FROM&quot; + params [&quot; SCHEMA&quot;] +&quot; .COBOL_CALENDAR&quot; +
FROMの前にスペースを追加すると修正されました。
液晶ディスプレイで頭を叩きます。
他のヒント
レポートのXMLソースを編集したように見えます。 SQL-Queryで任意の文字列を置換するよりグラフィカルな方法を次に示します。
クエリを次のように記述します。
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
dev
が有効なスキーマである場合、meta-data-setを選択できるようになり、それをレポートパラメーターに置き換えることができます。
次に、データセットをクリックして、「スクリプト」を選択します。タブ。ここで、「開く前」を選択します。置換ccriptを入力します:
this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);
この方法では、クエリを実行する前に、クエリテキスト内の文字列 dev
を SCHEMA
パラメータの値に置き換えます。必要なすべての文字列を置き換えることができます(質問の **?**
をリンクしますが、最初の段階で有効なスキーマを使用すると、設計段階でメタデータセットを使用できます。