【发布时间】:2011-02-28 21:15:54
【问题描述】:
最近我更新了一个水晶报表,它在客户端完成所有工作(选择、公式等),并使用 Oracle 11g 数据库通过存储过程更改了要在服务器端完成的所有逻辑.现在该报告仅用于显示存储过程的输出,没有其他用途。我读到的关于这个主题的所有内容都表明,使用存储过程应该会大大减少报告的运行时间,但从服务器检索数据仍然需要大致相同的时间。我写的存储过程有问题,还是水晶报表本身有问题?这是存储过程代码以及定义必要的REF CURSOR的包。
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;
【问题讨论】:
-
你真的需要使用光标吗?
-
我们需要查看
VW_METADATA的视图语句——使用存储过程只会突出实际查询的糟糕程度。根据提供的内容,这意味着视图内的内容没有帮助。
标签: oracle stored-procedures crystal-reports oracle11g