zoukankan      html  css  js  c++  java
  • 使用drving_site处理DBLINK数据的无数据的问题

          下面的存储过程是用来模拟错误的,通过begin p_test; end;来执行过程,过程执行后显示i的值不正常,多数返回为错误的0,实际上应该是4条记录,如果单独执行p_testb的程序能正常返回为4。
    如果取消/*+ driving_site(b)*/的提示也能每次正常返回数据,但是这样执行的时间太长了,也就没有这样用的必要了。
          下对于这种需要访问DBLINK的优化,是什么原因导致在存储过程中调用无数据的呢?还有其它好的办法优化调用DBLINK数据吗?

           已经找到问题的原因,就是第一块语句执行完成后,第二块语句读取才插入数据的表有延时,在第一块和第块块之间加入延迟就可以解决,由于没有DBMS_LOCK的执行权限,自己写了个延迟过程在2个块之间运行延迟1秒就可以解决了。

    1. create or replace procedure p_test is
    2. i number;
    3. procedure p_testa is
    4. CURSOR cur_order IS
    5. select a.ol_id, a.so_date
    6. from so.order_list@crmqry2 a WHERE a.status_cd not in ('S','D','P','PR')
    7. AND a.ol_type_cd <>6
    8. AND a.channel_id not in (-10001, -10002, -10000, -10006, -10007)
    9. and a.so_date > TRUNC(SYSDATE-1)
    10. and a.ol_id=100582681691
    11. AND a.so_date < TRUNC(SYSDATE);
    12. TYPE t_order IS TABLE OF cur_order%ROWTYPE;
    13. rec_order t_order;
    14. BEGIN
    15. OPEN cur_order;
    16. LOOP
    17. FETCH cur_order BULK COLLECT INTO rec_order LIMIT 40000;
    18. EXIT WHEN rec_order.count =0;
    19. FORALL i IN 1..rec_order.count
    20. INSERT /*+ append */ INTO ygl_zc07_order_b VALUES rec_order(i);
    21. COMMIT;
    22. END LOOP;
    23. CLOSE cur_order;
    24. END p_testa;
    25. --第二块取出退订实例
    26. procedure p_testb is
    27. begin
    28. select /*+ driving_site(b)*/ count(*) into i
    29. from ygl_zc07_order_b a, so.busi_order@crmqry2 b, so.oo_role@crmqry2 c
    30. WHERE a.ol_id=b.ol_id
    31. AND b.bo_id=c.bo_id
    32. and b.ol_id=100582681691
    33. AND c.obj_id IN (2, 9, 379)
    34. AND c.state='DEL'
    35. AND c.offer_role_id IN (select x.offer_role_id from spec.offer_roles@crmqry2 x WHERE x.offer_spec_id IN (SELECT y.offer_spec_id FROM spec.offer_spec@crmqry2 y WHERE y.offer_type_cd=1));
    36. dbms_output.put_line(i);
    37. END p_testb;
    38. begin
    39. execute immediate 'truncate table ygl_zc07_order_b';
    40. execute immediate 'truncate table ygl_zc07_prod_b';
    41. commit;
    42. p_testa;
    43. p_testb;
    44. end p_test;

     附:执行存储和单独执行匿名块的结果图

    无标题.jpg


    ---延迟存储过程

    1. CREATE OR REPLACE PROCEDURE ygl_time(mins NUMBER) IS
    2. t_a DATE := SYSDATE;
    3. t_b DATE;
    4. BEGIN
    5. t_b := t_a + mins / (24 * 60 * 60);
    6. WHILE SYSDATE < t_b LOOP
    7. NULL;
    8. END LOOP;
    9. RETURN;
    10. EXCEPTION
    11. WHEN OTHERS THEN
    12. NULL;
    13. RETURN;
    14. END;






  • 相关阅读:
    OpenFlow 消息
    Revolving Digits
    Tavas and Malekas
    Prefixes and Suffixes
    快速构造后缀自动机
    REBXOR
    BZOJ3689 异或之
    BZOJ3689 异或之
    最长路径异或和
    BZOJ 1355 [Baltic2009] Bazinga
  • 原文地址:https://www.cnblogs.com/highroom/p/80c60bf52bfe7af79162e9a3d607ad54.html
Copyright © 2011-2022 走看看