在 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);

Demo.