2012-02-29 8 views
0

実行時に設定されたパラメータを使用してデータ・セットを作成できるようにBIRTを取得するのに問題があります。私にエラーを与えている動的データを含むBIRTデータ・セットの作成 - ORA-01722

SQLは次のとおりです。私は私のレポートパラメータがPaynoBegin、PaynoEndとして定義している

... 
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1 
where D1.NHRDIST_PAYNO between '@PAYNO_BEGIN' and '@PAYNO_BEGIN' 
AND D1.NHRDIST_YEAR = '@YEAR' 
... 

、年

次のように私もbeforeOpenに設定されたデータセットのスクリプトを持っている

queryText = String (queryText).replace ("@PAYNO_END", Number(params["PaynoEnd"])); 
queryText = String (queryText).replace ("@PAYNO_BEGIN", Number(params["PaynoBegin"])); 
queryText = String (queryText).replace ("@YEAR", Number(params["Year"])); 

問題は、しかし、私は同じように動作し10件の他のレポートを持って、JDBCは、このことからResultSetを得ることができないということのようです。私はwhere節をコメントアウトし、データセットを生成します。私はまた、where節を2つに分割し、< =と> =の句で解読しようとしましたが、ORA-01722行に無効な数値エラーがスローされます。

これについてのご意見はありますか?

答えて

0

二つのかなりの別々の思考:

1)あなたは、クエリであなたのパラメータのそれぞれの周りに単一引用符を持って、まだ各1が数値であるかのようにそれが表示されます - 単一引用符を削除してみてください、where句ように、

where D1.NHRDIST_PAYNO between @PAYNO_BEGIN and @PAYNO_BEGIN 
AND D1.NHRDIST_YEAR = @YEAR 

3つのパラメータがすべて必要であることを忘れないでください。クエリで引き続きエラーが返された場合は、@PAYNO_BEGIN、@PAYNO_BEGINおよび@YEARをクエリ文字列のハードコードされた数値で置き換えて、まだエラーが発生していないかどうかを確認してください。

2)現在、動的SQLを修正しているクエリ文字列を使用して、指定したマーカーを入力されたパラメータのテキストに置き換えています。これにより、あなたはSQL Injection attacksに脆弱になります。もしあなたがその用語になじみがなければ、簡単な例hereを見つけることができます。

SQLインジェクション攻撃を数値パラメータで実装できないという印象を受けている可能性があります。Tom Kite氏は最近、彼のblogにSQLインジェクションについていくつかの記事を掲載しました。 SQL Injection flaw using NLS settings with numbers

代わりに、バインドパラメータを使用する必要があります。 、レポートでそう含まれるようにクエリを修正するには、次の代わりに、既存のコードの

... 
FROM SPRIDEN, SPBPERS P, POSNCTL.NBRJOBS X, NHRDIST d1 
where D1.NHRDIST_PAYNO between ? and ? 
AND D1.NHRDIST_YEAR = ? 
... 

を、beforeOpenスクリプトからQUERYTEXT置換コードを削除し、PaynoBegin、PaynoEndと年レポートパラメータに3セットのパラメータをマッピングそれぞれデータセットエディタに表示されます。 (照会テキスト内の他の置き換えられたテキストも変更して、パラメータマーカー(?)をバインドし、必要に応じてデータセットパラメータをマップする必要があります)。

+0

これを実行しました。私は "BIRT - A Field Guide"で同じ解決策を見つけたときにこれを投稿した直後に試してみましたが、うまくいかないでしょう。もう一度やり直してみてください。これはWeb ViewerやWeb Appでも動作しています。ありがとう@マークバニスター – idonaldson

関連する問題