代码之家  ›  专栏  ›  技术社区  ›  Omnipresent

在oracle中追加到游标

  •  0
  • Omnipresent  · 技术社区  · 16 年前

    我问了一个问题 question 昨天得到了答案,但没有回答要点。我想减少做手术的时间 MINUS 操作。

    现在,我在考虑 以5000块为单位的操作,将每个迭代结果附加到游标,最后返回游标。

    V_CNT           NUMBER :=0;
    V_INTERVAL      NUMBER := 5000;
    
    begin
      select count(1) into v_cnt from TABLE_1
    while (v_cnt > 0)
    loop
    open cv_1 for
        SELECT  A.HEAD,A.EFFECTIVE_DATE,
        FROM   TABLE_1 A
        WHERE  A.TYPE_OF_ACTION='6' AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)  
        AND A.ROWNUM <= V_INTERVAL
        MINUS
        SELECT  B.head,B.EFFECTIVE_DATE,
        FROM  TABLE_2 B
        AND B.ROWNUM <= V_INTERVAL
    
    V_CNT := V_CNT - V_INTERVAL;
    END LOOP; 
    end;
    

    cv_1 光标而不是覆盖?

    2 回复  |  直到 9 年前
        1
  •  0
  •   Peter Lang    16 年前

    这不是游标的工作方式,您必须将值存储在某种集合中。

    Table_1 并删除从中选择的5000个随机行中也存在的行 Table_2 .


    你有没有试过不戴眼镜就做 MINUS ?

    据我所知,查询结果应该与此相同:

    Select  a.head, a.effective_date,
    From table_1 a
    Left Join table_2 b On (b.head = a.head And b.effective_date = a.effective_date )
    Where a.type_of_action='6' And a.effective_date >= ADD_MONTHS(SYSDATE,-15)  
      And b.head Is Null;
    

    TABLE_1 (type_of_action, head, effective_date) 继续 TABLE_2 (head, effective_date) 应该对你的表现有帮助。

        2
  •  1
  •   The Machine    16 年前

    你没有把要求说清楚。 i、 你想在A中找到不在B中的元组。

    假设这样,您编写的逻辑不是完全正确的,因为您正在对a和B的相应(5000长度)批执行减号。

    例如:您的逻辑将返回表a中第4000行的一个元组,即表B中第6000行的元组。