我有一个程序,有一个参数和一个游标。该光标给出的结果如下所示:如何在Oracle中组合结果集?
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#/等。性能很糟糕时,维护的便利性值得吗? – 2011-06-03 15:04:21
请澄清一下:您是否想要 1)执行多个过程调用(每个过程调用不同的参数)并让Oracle合并结果。 2)使用多个参数执行单个过程,并在单个响应中获得这些结果的联合。 或 3)多次执行一个程序并得到一个组合结果集,你不关心它们在哪里结合? (如果是这样,请将您的开发语言添加到OP_) – 2011-06-03 15:09:38
我添加了基础查询。我认为@CosCallis的第1项描述了我想要的。 – brantgurga 2011-06-03 15:55:08