1

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("SCHEMANAME")私も同じ結果でルートを試しました。

4

2 に答える 2

2

ARRRGHそれはスペースの愚かな問題でした!!

"END)AS DAYOFWEEK" + "FROM" + params ["SCHEMA"]+"。COBOL_CALENDAR"+

FROMの前にスペースを追加すると修正されました。

液晶ディスプレイで頭を前髪します。

于 2009-03-03T19:00:54.637 に答える
0

レポートの XML ソースを編集したようです。以下は、SQL クエリ内の任意の文字列をよりグラフィカルに置換する方法です。

クエリを次のように記述します。

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、メタデータ セットを選択できるようになり、レポート パラメータで置き換えることができます。

次にデータセットをクリックし、「スクリプト」タブを選択します。ここで「beforeOpen」を選択し、置換スクリプトを入力します。

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

devこのようにして、クエリを実行する前に、クエリ テキストの StringをSCHEMAParameter の値に置き換えます。必要なすべての文字列を置き換えることができます(**?**質問からのリンクですが、最初に有効なスキーマを使用すると、設計段階でメタデータセットを使用できます。 ここに画像の説明を入力

于 2016-04-01T09:32:47.020 に答える