2009-07-06 133 views
4

我正在開發一個連接到Oracle 11g數據庫的Sql Server Reporting Services 2005中的報告。在發佈回覆時,可能會有助於瞭解我熟練使用MSSQL Server並且在Oracle中沒有經驗。來自Oracle DB的SSRS報告 - 使用存儲過程

我有多個嵌套的子報表,需要在外部報表和相同的數據中使用摘要數據,但在內部報表中有詳細說明。爲了讓DB服務器免受多次執行,我想在開始時填充一些臨時表,然後在報表和子報表中多次查詢它們。

在SSRS中,數據集明顯按它們出現在RDL文件中的順序執行。你可以有一個不返回行集的數據集。所以我創建了一個存儲過程來填充我的四個臨時表,並將其作爲我報告中的第一個數據集。當我從SQLDeveloper運行它時,此SP起作用,並且我可以查詢臨時表中的數據。然而,這似乎沒有解決,因爲SSRS顯然不會重複使用同一個會話,所以即使全局臨時表是用ON COMMIT PRESERVE ROWS創建的,我的數據集也是空的。

我切換到使用「真正的」表,現在傳入一個額外的參數,一個字符串形式的GUID,在每個新執行中唯一生成,這是每個表的主鍵的一部分,所以我可以返回只是這個執行的行。

從SQL Developer的運行能正常工作,例如:

DECLARE 
ActivityCode varchar2(15) := '1208-0916  '; 
ExecutionID varchar2(32) := SYS_GUID(); 
BEGIN 
CIPProjectBudget (ActivityCode, ExecutionID); 
END; 

沒關係,在這個例子中,我不知道GUID,這只是證明了它的工作原理,因爲行被插入到我的四個表。

但是,在SSRS報告中,我的數據集中仍然沒有行,SQL Developer確認沒有行正在插入。

所以,我線沿線的思考:

  • Oracle使用隱式事務和我的修改沒有得到提交?
  • 儘管我可以證明非rowset返回的SP正在執行(因爲如果我省略參數映射,它報告渲染時間關於沒有足夠的參數),也許這不是真的執行。不知何故。
  • 錯誤的執行順序不是問題,或行將出現在表中,它們不是。

我對如何做到這一點(尤其是關於不多次運行主查詢部分)的任何想法感興趣。我會重新設計我的整個報告。我將停止使用存儲過程。建議你喜歡的任何東西!我只是需要幫助讓這個工作,我卡住了。

如果您想了解更多詳細信息,在我的SSRS報告中,我有一個List對象(它是一個容器,對於數據集中的每一行重複一次),它具有一些標頭值,然後包含一個子報表。最終將有四個總報告:一個主報告,三個嵌套子報告。每個子報表將在父報告的列表中。

回答

2

感嘆。

在SP中選擇的列具有char數據類型,但SP具有varchar2輸入參數。在Oracle中,varchar2變量實際上會丟失它們的尾部空格(與SQL Server不同)。最重要的是,我正在從數據庫查詢SSRS參數上的RTrim()。

對於那些想知道...... Oracle中的SP無法返回行集的人。所以如果你從SSRS運行SP,那大概是填充表格。但SSRS默認通常同時運行查詢。要使其連續運行查詢,請編輯運行SP的數據集,單擊「數據源」下拉列表旁邊的「...」按鈕,然後選中底部的「使用單個事務」複選框。只要SP是RDL文件中列出的第一個數據集,它應該先運行,其他數據集將一直等到它完成。注意:此設置適用於使用相同數據源的所有數據集。

+0

你應該把你的評論的內容放到你的答案中,這樣人們才能更容易地找到它(所以你可以得到更多的代表!)。 ;) – 2010-04-14 11:37:31