最近,我更新了一個在客戶端(選擇,公式等)完成所有工作的Crystal Report,並更改了在服務器端完成的所有邏輯通過使用Oracle 11g數據庫的存儲過程。現在報告只用於顯示存儲過程的輸出,而沒有其他信息。我在這個主題上讀到的一切都表明,利用存儲過程應該會大大減少報表的運行時間,但從服務器檢索數據所需的時間仍然大致相同。我寫的存儲過程有問題嗎,還是Crystal Report本身存在問題?以下是存儲過程代碼以及定義所需的REF CURSOR的包。使用存儲過程提高Crystal Reports的性能
CREATE OR REPLACE
PROCEDURE SP90_INVENTORYDATA_ALL
(
invdata_cur IN OUT sftnecm.inv_data_all_pkg.inv_data_all_type,
dCurrentEndDate IN vw_METADATA.CASEENTRCVDDATE%type,
dCurrentStartDate IN vw_METADATA.CASEENTRCVDDATE%type
)
AS
BEGIN
OPEN invdata_cur FOR
SELECT
vw_METADATA.CREATIONTIME,
vw_METADATA.RESRESOLUTIONDATE,
vw_METADATA.CASEENTRCVDDATE,
vw_METADATA.CASESTATUS,
vw_METADATA.CASENUMBER,
(CASE WHEN vw_METADATA.CASEENTRCVDDATE < dCurrentStartDate AND (
(vw_METADATA.CASESTATUS is null OR vw_METADATA.CASESTATUS != 'Closed') OR
TO_DATE(vw_METADATA.RESRESOLUTIONDATE, 'MM/DD/YYYY') >= dCurrentStartDate) then 1 else 0 end) InventoryBegin,
(CASE WHEN (to_date(vw_METADATA.RESRESOLUTIONDATE, 'MM/DD/YYYY') BETWEEN dCurrentStartDate AND dCurrentEndDate)
AND vw_METADATA.RESRESOLUTIONDATE is not null AND vw_METADATA.CASESTATUS is not null then 1 else 0 end) CaseClosed,
(CASE WHEN vw_METADATA.CASEENTRCVDDATE BETWEEN dCurrentStartDate AND dCurrentEndDate then 1 else 0 end) CaseCreated
FROM vw_METADATA
WHERE vw_METADATA.CASEENTRCVDDATE <= dCurrentEndDate
ORDER BY vw_METADATA.CREATIONTIME, vw_METADATA.CASESTATUS;
END SP90_INVENTORYDATA_ALL;
和封裝:
CREATE OR REPLACE PACKAGE inv_data_all_pkg
AS TYPE inv_data_all_type IS REF CURSOR
RETURN inv_data_all_temp%ROWTYPE;
END inv_data_all_pkg;
你真的需要使用遊標嗎? – DOK 2010-06-07 20:22:34
@DOK:IME,是的。 – 2010-06-07 20:23:15
我們需要查看'VW_METADATA'的視圖語句 - 使用存儲過程只強調了實際查詢的差異。根據提供的內容,這意味着視圖內的內容不起作用。 – 2010-06-07 20:26:49