我有一个具有in参数和out游标的过程。该光标给出的结果如下所示:
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中做到这一点?Fetch with bulk collect看起来很有前途,但我没有看到在我的特定场景中使用它的好方法。
发布于 2011-06-03 23:40:39
您可以作为一个联合来执行此操作,包括一个标识组的列。单个选择将或多或少地复制您的DailyLoad SP正在执行的操作。
select foo.Mygroup, sum(foo.col1)
from
(
select 'A' as MyGroup, col1 WHERE ...
union all
select 'B' as MyGroup, col1 WHERE ...
union all
select 'C' as MyGroup, col1 WHERE ...
) as Foo
group by MyGroup如果事先不知道组的数量,则可以构建符合此基本结构的动态sql语句。
如果组的数量太多,以至于您的动态语句太大,则可以使用存储过程将每次调用的结果与MyGroup列一起推入临时表。然后,您可以通过select语句对临时表发出group。
https://stackoverflow.com/questions/6228739
复制相似问题