【发布时间】:2011-06-03 14:55:18
【问题描述】:
我有一个包含输入参数和输出游标的过程。该光标给出的结果如下所示:
0100 | 0
0130 | 1
0200 | 2
0230 | 0
...
第一列是静态时间码。第二列是在给定日期的那个时间段内安排了多少次的聚合。
那个程序是:
PROCEDURE DAILYLOAD (datep IN DATE, results OUT SYS_REFCURSOR)
AS
BEGIN
Open results for
SELECT RUN_TIME_C, COUNT (SCH_RPT_I)
FROM ITS_SCH_RPT_RUN_TIME
LEFT OUTER JOIN
ITS_SCH_RPT
ON ( RUN_TIME_C = RUN_TIME1_C
OR RUN_TIME_C = RUN_TIME2_C
OR RUN_TIME_C = RUN_TIME3_C)
WHERE EXP_DATE_D IS NULL
OR datep < exp_date_d AND datep > start_date_d AND SUSPENDED_USER='N'
AND ( ( (TO_CHAR (datep, 'D') = 1) AND RUN_SUNDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 2) AND RUN_MONDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 3) AND RUN_TUESDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 4) AND RUN_WEDNESDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 5) AND RUN_THURSDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 6) AND RUN_FRIDAY_C = 'Y')
OR ( (TO_CHAR (datep, 'D') = 7) AND RUN_SATURDAY_C = 'Y'))
GROUP BY RUN_TIME_C
ORDER BY RUN_TIME_C;
END DAILYLOAD;
我想用不同的参数从包装过程中多次调用这个过程,这样我就可以得出每周负载和每月负载。从概念上讲,这可以通过将各个结果集通过 union all 之类的方法连接起来,然后通过第一列对每个分组的第二列求和来进行分组。
现在,我有类似的东西
Dailyload(datep, results1);
Dailyload(datep + 1, results2);
...
OPEN results FOR
SELECT run_time_c,
SUM(rpt_option_i)
FROM SELECT *
FROM results1
UNION ALL
SELECT *
FROM results2
UNION ALL ...
GROUP BY run_time_c
ORDER BY run_time_c
有没有办法在 Oracle 中做到这一点?使用批量收集进行获取看起来很有希望,但我没有看到在我的特定场景中使用它的好方法。
【问题讨论】:
-
您需要发布执行繁重工作的查询——即运行多次的查询。当您封装功能时,SQL 往往表现不佳——它是基于 SET 的,不像 Java/C#/等。当性能不佳时,易于维护是否值得?
-
请澄清:您是否想要 1) 执行多个过程调用(每个具有不同的参数)并让 Oracle 合并结果。 2) 使用多个参数执行单个过程,并在单个响应中获得这些结果的联合。或者 3) 多次执行一个过程并获得一个组合结果集,你不在乎它们在哪里组合? (如果是,请将您的开发语言添加到 OP 中)
-
我添加了基础查询。我认为@CosCallis 的第 1 项描述了我想要的。
-
似乎有一个版本会更容易,您可以在其中传递您想要总结的天数,并相应地调整日期检查。
date_p < (exp_date_d + num_days_p),例如,也许。 -
@Alex Poole:同意。或者更琐碎的
startdate_p和enddate_p。
标签: sql oracle query-optimization