【发布时间】:2018-10-03 16:51:25
【问题描述】:
所以我试图按小时将聚合(求和)值插入到值表中。按小时插入值后,我想在同一过程中按天插入综合总和。有没有办法让存储过程按小时完成插入,然后通过对“每小时”过程中刚刚插入的数据求和来绘制游标?我是否需要提交第一个事务,然后不久再创建另一个游标?
以下是一些示例数据:
已经按小时求和/聚合的查询结果:
SUM (VALUE_TX) UTC_OFFSET DATA_DATE HR
5 8 902018 1
10 8 902018 2
4 8 902018 3
在将上面的第一个结果集插入到表中之后,我想要插入的内容。我将从我将要插入的同一个表中提取这些值。
SUM (VALUE_TX) UTC_OFFSET DATA_DATE HR
19 8 902018 null
我正在考虑执行以下操作,但我不确定这是否是最好的方法。我打算按 data_Date 分组以形成第二个游标。
Create or replace procedure AGG_HOURLY_DAILY IS
CURSOR c1 is
Select sum(value_Tx) as sum_of_values
, utc_offset
, data_date
, hr
from value
group by data_date, utc_offset, hr
where HR is not null;
l_var c1%ROWTYPE;
CURSOR c2 is
Select sum(value_tx)
, utc_offset
, data_date
, hr
group by data_date, utc_offset, hr
Where HR is null;
k_var c2%rowtype;
BEGIN
Open C1;
LOOP;
FETCH c1 into l_var;
EXIT WHEN c1%NOTFOUND;
Insert into value(value_id, value_tx, utc_offset, data_date, hr)
values(null, l_var.sum_of_values, l_var.utc_offset, l_var.data_date, l_var.hr);
END LOOP;
CLOSE C1;
OPEN C2;
LOOP;
FETCH c2 into k_var;
EXIT WHEN c2%NOTFOUND;
Insert into value(value_id, value_tx, utc_offset, data_date, hr)
values(null, l_var.sum_of_values, l_var.utc_offset, l_var.data_date, l_var.hr);
END LOOP;
Close c1;
Close c2;
END AGG_HOURLY_DAILY;
注意:Value_ID 由我创建的序列/触发器自动生成
【问题讨论】:
-
我相信 ORACLE 支持 GROUP BY ROLLUP 子句,因此您可以通过一个查询完成整个操作,而无需游标。如果您将第一个查询放入公共表表达式中,那么让您的第二个查询引用您应该能够访问所需数据集的 CTE。
-
@DavePoole 你能给我看一个简单的例子吗? (对不起)
-
另外,如果我没有游标,如何在不使用循环的情况下将整个结果集加载到表中?