2011-07-27 13 views
1

Crystal Reportsでは、SQLをレポートのパラメータに文字列として直接渡すことができ、レポートの実行時にSQLが解決されます。BIRT SQLをクエリのパラメータに渡す

たとえば、前月に関連するデータのレポートを毎月の始めに実行するようにスケジュールするとします。

SELECT 
    sum(jobid) jobs 
FROM 
    job 
WHERE 
    created_date >= {?StartDate} 
    and created_date < {?EndDate} 

代わりの日付フィールドに開始日と終了日のパラメータを設定し、文字列と渡すパラメータを設定することができ、毎月のレポートに送信されたパラメータを更新すること:特定のレポートのクエリは次のようになります。

StartDate = add_months(trunc(sysdate, 'mm'), -1) 
EndDate = trunc(sysdate, 'mm') 

このように、スケジュールされたレポートが実行されるたびに、実行する正しい期間が自動的に決定されます。これは、Crystalレポートが引数を 'trunc(sysdate、' mm ')'ではなくリテラルとして渡すためです。

このようなBIRTレポートパラメータにSQLを渡すことはできますか?私はBIRT plug-in for Eclipseを使用しており、BIRTが単一引用符で完全なSQL文字列としてクエリにパラメータを渡していることを示唆するORACLEエラーが続いています。

+0

SQLをレポートパラメータに渡す理由を説明できますか? MystikSpiralが指摘するように、SQLインジェクション攻撃の危険性があります。http://xkcd.com/327/ –

+0

SQL攻撃の危険にさらされているかどうかは状況に依存しませんか?これがすべてのサーバー側で実行されており、生のユーザー入力がない場合、私はリスクを見ません。 – Rebzie

答えて

1

私はあなたがこれをやりたいとは思わない(それは可能ですが、お勧めできません)。 SQLインジェクション攻撃までレポートを開くことができます。だから私はあなたの質問に答えるようにすることができます、あなたは本当にこれをしたい場合は、データセットオープンイベント内のパラメータ値に "this.query"を設定することができます。

もっと重要なことは、問題の根本を見てください。どんなドライバーを使っていますか?最終的に、ドライバはBIRTのクエリを準備して実行します。同じドライバを使ってBIRTの外側でクエリを実行できますか?調べるもう1つの場所は、レポートに設定されたパラメータです。パラメータは強く型付けされていますか?それは、それが "?"の下位に置かれたときにクエリテキストに正しく挿入できるように強く型付けする必要があります。あなたがあなたのルートクエリーに持っているプレースホルダー。

Good Luck!

関連する問題