0

トランザクションを処理する Oracle SQL クエリに基づいて、iReport でレポートを作成しようとしています。関連する実際のテーブルは非常に長く、問題とはあまり関係がありません。取引金額が次の 3 つの基準のいずれかを満たす場合に結果を返すレポートを作成しようとしています。

  • 1000.00 から 2499.99 の間
  • 2500.00 から 9999.99 の間
  • >= 10000.00

レポートを実行する人が上記の仕様のいずれかを選択できる単一の選択リスト パラメーターを作成しようとしています。実際にパラメータを作成する前に、SQL Developer でクエリをテストしようとしました。これを実装しようとしているクエリの行は次のとおりです。

alias.transaction_amount :amountRange

私のテスト入力は「1000から9999の間」です。それがクエリでハードコーディングされている場合は正常に機能しますが、この入力を介して渡そうとすると、「無効な関係演算子」エラーが発生します。

これを行う別の方法はありますか?

4

2 に答える 2

1

Try to use like this in query:
select ... from table1 where transaction_amount $P!{paramReport}

From JasperReports Ultimate Guide:

$P{paramName} Syntax
The parameters are used like normal java.sql.PreparedStatement parameters, using
the following syntax:
<queryString>
<![CDATA[
SELECT * FROM Orders WHERE OrderID <= $P{MaxOrderID} ORDER BY
ShipCountry
]]>
</queryString>

$P!{paramName} Syntax
Sometimes it is useful to use parameters to dynamically modify portions of the SQL
query or to pass the entire SQL query as a parameter to the report-filling routines. In
such cases, the syntax differs a little, as shown in the following example. Notice the !
character:
<queryString>
<![CDATA[
SELECT * FROM $P!{MyTable} ORDER BY $P!{OrderByClause}
]]>
</queryString>
于 2013-03-01T06:32:23.600 に答える
0

何人かの同僚と話をした後、私たちはこの問題のより良い解決策を発見しました。私が探していた方法が実際に可能かどうかはわかりませんが、この解決策ははるかに直感的です。

alias.transaction_amount between (CASE WHEN $P{Range} = 0
                                       THEN 1000.00
                                       WHEN $P{Range} = 1
                                       THEN 2500.00
                                       ELSE 10000.00
                                       END)
                                 and
                                 (CASE WHEN $P{Range} = 0
                                       THEN 2499.99
                                       WHEN $P{Range} = 1
                                       THEN 9999.99
                                       ELSE 9999999.99
                                       END)

switchパラメータでcaseステートメントを使用すると、10億ドル以上のトランザクションが発生した場合は除外されますが、必要に応じて最大数を調整できるため、完全に機能します。

于 2013-03-01T20:58:10.390 に答える