2012-02-29 71 views
0

在讓BIRT允許我創建一個包含在運行時設置的參數的數據集時遇到一些困難。使用動態數據創建BIRT數據集 - ORA-01722

這是給我的錯誤的SQL是:

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

我有我的報表參數定義爲PaynoBegin,PaynoEnd,

我也有一個數據集腳本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"])); 

問題似乎是JDBC無法從中得到ResultSet,但我有10個其他報告以相同的方式工作。我已經註釋了where子句,它會生成數據集。我也試過把where子句分成兩個和子句< =和> =,但是它仍然會拋出一個ORA-01722無效的數字錯誤。

對此有何看法?

回答

0

兩個完全不同的想法:

1)你必須繞過每一個查詢你的參數的單引號,但它看起來好像每個人都是一個數字 - 嘗試刪除單引號,讓where條款看起來像這樣:

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

不要忘記,所有三個參數都應該是必需的。如果查詢仍然返回錯誤,請嘗試用查詢字符串中的硬編碼數字值替換@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腳本QU​​ERYTEXT替換代碼和地圖這三個數據集參數的PaynoBegin,PaynoEnd和年報表參數分別在數據集編輯器中。 (您還應該更改查詢文本中的任何其他替換文本,以根據需要綁定參數標記(?)和映射數據集參數。)

+0

這樣做。當我在「BIRT - 現場指南」中找到相同的解決方案時,我發佈了這個試用版,但它不起作用。再次運行它,它現在可以在Web查看器中使用,也可以在我們的Web應用程序中使用。謝謝@Mark Ba​​nnister – idonaldson 2012-03-01 15:37:31