在 oracle 中使用游标从其他 table 添加值
add values from other table using cursor in oracle
我正在尝试执行以下步骤:
假设我们有一个 table t1
CREATE TABLE t1 (i1 varchar2,d1 varchar2,l1 varchar2, h1 number(1),q1 number, s1 date );
insert into t1 values('123','1','123-1',0,0,sysdate);
insert into t1 values('123','1','234-1',0,0,sysdate+2);
insert into t1 values('456','2','345-1',0,0,sysdate);
insert into t1 values('456','2','456-1',0,0,sysdate+2);
CREATE TABLE t2 (i2 varchar2,d2 varchar2,q2 number,a2 date );
insert into t2 values('123','1','1230',sysdate);
insert into t2 values('123','1','2340',sysdate+1);
insert into t2 values('456','2','3450',sysdate);
insert into t2 values('456','2','4560',sysdate+1);
现在我必须对相同的 i1 和 d1 按 s1 的升序排列 t1 数据,然后检查 t2 的 a2 列。如果 a2>=s1 但 a2< s1 的下一个更大的值,则添加 q2 并将其分配给 q1。
我正在尝试编写一个游标,它将按照 s1 的升序从 t1 中获取值,
for t2.a2>=s1 and t2.a2<s2 --s2 is next greater date value of t1.s1 column
q1 = q1+q2;
我无法找到执行此操作的有效方法。
我的光标是:
cursor c1 is (select * from(select i1,d1,s1,min(s1) from t1 where h1=0
group by i1,d1,s1 order by i1,d1,s1));
declare
v_s
v_i
v_d
v_s1
v1 date;
v_q number;
begin
open c1;
fetch c1 into v_i,v_d,v_s,v1;
loop
select s1 into v_s1
from t1 t
where t.i1 = v_i and t.d1=v_d and t.s1>v_s;
select sum(t2.q2) into v_q
from t2 t
where t2.i1=v_i and t2.d2=v_d and t2.a2>=v_s and t2.a2<v_s1;
update t1 set q1 = v_q;
end loop;
close c1;
end;
如果 a2 介于 min 和 max(s1) 之间,我希望 q1 填充所有 a2 日期的 sum(q2)。
我无法执行此操作。我要么一直找不到数据,要么获取的行太多,要么出现其他错误。我怎样才能有效地做到这一点?
由于您没有分享最终结果,我想您希望第 2 行和第 4 行对于第 Q1 列为空。您可以尝试下面的 co-related 子查询以获得所需的结果 -
UPDATE t1
SET Q1 = (SELECT SUM(q2)
FROM (SELECT t2.*, a2 - lag(a2) over(partition by i2, d2 order by a2) date_diff
FROM t2) t2
WHERE t1.i1 = t2.i2
AND t1.d1 = t2.d2
AND t1.s1 <= t2.a2
AND NVL(date_diff, 1) = 1);
我正在尝试执行以下步骤:
假设我们有一个 table t1
CREATE TABLE t1 (i1 varchar2,d1 varchar2,l1 varchar2, h1 number(1),q1 number, s1 date );
insert into t1 values('123','1','123-1',0,0,sysdate);
insert into t1 values('123','1','234-1',0,0,sysdate+2);
insert into t1 values('456','2','345-1',0,0,sysdate);
insert into t1 values('456','2','456-1',0,0,sysdate+2);
CREATE TABLE t2 (i2 varchar2,d2 varchar2,q2 number,a2 date );
insert into t2 values('123','1','1230',sysdate);
insert into t2 values('123','1','2340',sysdate+1);
insert into t2 values('456','2','3450',sysdate);
insert into t2 values('456','2','4560',sysdate+1);
现在我必须对相同的 i1 和 d1 按 s1 的升序排列 t1 数据,然后检查 t2 的 a2 列。如果 a2>=s1 但 a2< s1 的下一个更大的值,则添加 q2 并将其分配给 q1。
我正在尝试编写一个游标,它将按照 s1 的升序从 t1 中获取值,
for t2.a2>=s1 and t2.a2<s2 --s2 is next greater date value of t1.s1 column
q1 = q1+q2;
我无法找到执行此操作的有效方法。 我的光标是:
cursor c1 is (select * from(select i1,d1,s1,min(s1) from t1 where h1=0
group by i1,d1,s1 order by i1,d1,s1));
declare
v_s
v_i
v_d
v_s1
v1 date;
v_q number;
begin
open c1;
fetch c1 into v_i,v_d,v_s,v1;
loop
select s1 into v_s1
from t1 t
where t.i1 = v_i and t.d1=v_d and t.s1>v_s;
select sum(t2.q2) into v_q
from t2 t
where t2.i1=v_i and t2.d2=v_d and t2.a2>=v_s and t2.a2<v_s1;
update t1 set q1 = v_q;
end loop;
close c1;
end;
如果 a2 介于 min 和 max(s1) 之间,我希望 q1 填充所有 a2 日期的 sum(q2)。
我无法执行此操作。我要么一直找不到数据,要么获取的行太多,要么出现其他错误。我怎样才能有效地做到这一点?
由于您没有分享最终结果,我想您希望第 2 行和第 4 行对于第 Q1 列为空。您可以尝试下面的 co-related 子查询以获得所需的结果 -
UPDATE t1
SET Q1 = (SELECT SUM(q2)
FROM (SELECT t2.*, a2 - lag(a2) over(partition by i2, d2 order by a2) date_diff
FROM t2) t2
WHERE t1.i1 = t2.i2
AND t1.d1 = t2.d2
AND t1.s1 <= t2.a2
AND NVL(date_diff, 1) = 1);