欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Oracle存儲過(guò)程實(shí)現多線(xiàn)程對表數據的抽取

  Oracle存儲過(guò)程實(shí)現多線(xiàn)程對表數據的抽取 收藏
原先使用ForUpdateSkipLocked,但直到11g,這個(gè)參數還未被正式支持,而且在此之上使用排序還存在問(wèn)題,所以改用符合ANSI的ForUpdateNowait來(lái)實(shí)現。
CREATE OR REPLACE PACKAGE BODY RESB_MT_TABLE_PKG AS
  -- Try to lock thw row by RowId
  -- 1 Successful
  -- 0 Failed
  FUNCTION RESB_MT_LOCK_ROW(i_table_source in varchar2, i_rid in rowid)
    RETURN NUMBER IS
    o_ret_id number := 0;
  BEGIN
    EXECUTE IMMEDIATE 'select 1
    from ' || i_table_source || '
   where rowid = :x
     for update nowait'
      INTO o_ret_id
      USING i_rid;
    RETURN 1;
  EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -54 THEN
        RETURN 0;
      ELSE
        RAISE;
      END IF;
  END;

  -- Update the columns which you want.
  PROCEDURE RESB_MT_UPDATE_COLUMNS(i_table_source      in varchar2,
                                   i_update_expression in varchar2) IS
  BEGIN
    EXECUTE IMMEDIATE 'update ' || i_table_source || ' set ' ||
                      i_update_expression ||
                      ' where rowid in (select rid from RESB_MT_TT_ROWIDS)';
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END;

  -- Find in all and Skip locked
  -- Void
  PROCEDURE RESB_MT_FIND_ROWS_VOID(i_table_source      in varchar2,
                                   i_search_condition  in varchar2,
                                   i_order_expression  in varchar2,
                                   i_update_expression in varchar2,
                                   i_rcount            in number) IS
    TYPE c_type IS REF CURSOR;
    resb_mt_cur    c_type;
    v_rowid        ROWID;
    v_locked_count NUMBER := 0;
    v_sql          VARCHAR2(4000) := 'select rowid from ' || i_table_source ||
                                     ' where ' || i_search_condition ||
                                     ' order by ' || i_order_expression;
  BEGIN
    OPEN resb_mt_cur FOR v_sql;
    LOOP
      FETCH resb_mt_cur
        INTO v_rowid;
      EXIT WHEN resb_mt_cur%NOTFOUND;
      IF RESB_MT_LOCK_ROW(i_table_source, v_rowid) = 1 THEN
        INSERT INTO RESB_MT_TT_ROWIDS VALUES (v_rowid);
        v_locked_count := v_locked_count + 1;
      END IF;
      EXIT WHEN v_locked_count = i_rcount;
    END LOOP;
    CLOSE resb_mt_cur;
    -- Update the columns which you want
    IF i_update_expression IS NOT NULL THEN
      RESB_MT_UPDATE_COLUMNS(i_table_source, i_update_expression);
    END IF;
    RETURN;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END;

  -- Find in all and Skip locked
  -- Return CURSOR
  PROCEDURE RESB_MT_FIND_ROWS(i_table_source      in varchar2,
                              i_search_condition  in varchar2,
                              i_order_expression  in varchar2,
                              i_update_expression in varchar2,
                              i_rcount            in number,
                              o_resb_mt_cur       out resb_mt_cursor_type) IS
    TYPE c_type IS REF CURSOR;
    resb_mt_cur    c_type;
    v_rowid        ROWID;
    v_locked_count NUMBER := 0;
    v_sql          VARCHAR2(4000) := 'select rowid from ' || i_table_source ||
                                     ' where ' || i_search_condition ||
                                     ' order by ' || i_order_expression;
    v_o_sql        VARCHAR2(4000) := 'select * from ' || i_table_source ||
                                     ' where rowid in (select rid from RESB_MT_TT_ROWIDS)' ||
                                     ' order by ' || i_order_expression;
  BEGIN
    OPEN resb_mt_cur FOR v_sql;
    LOOP
      FETCH resb_mt_cur
        INTO v_rowid;
      EXIT WHEN resb_mt_cur%NOTFOUND;
      IF RESB_MT_LOCK_ROW(i_table_source, v_rowid) = 1 THEN
        INSERT INTO RESB_MT_TT_ROWIDS VALUES (v_rowid);
        v_locked_count := v_locked_count + 1;
      END IF;
      EXIT WHEN v_locked_count = i_rcount;
    END LOOP;
    CLOSE resb_mt_cur;
    -- Update the columns which you want
    IF i_update_expression IS NOT NULL THEN
      RESB_MT_UPDATE_COLUMNS(i_table_source, i_update_expression);
    END IF;
    OPEN o_resb_mt_cur FOR v_o_sql;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END;
END;
 
這個(gè)性能的關(guān)鍵是要及時(shí)回寫(xiě)狀態(tài)欄位,使下一個(gè)線(xiàn)程不會(huì )嘗試太多的記錄。
Oracle的AQ也同樣實(shí)現,各位大蝦誰(shuí)能講解一下其實(shí)現方法?
發(fā)表于 @ 2008年01月23日 13:15:00 | 評論( 0 ) | 編輯| 舉報| 收藏


本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/leo_fanaq/archive/2008/01/23/2061022.aspx

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
如何刪除SQLServer表中重復記錄
ORACLE PL/SQL編程詳解之二:
Oracle中查找和刪除重復記錄方法簡(jiǎn)介
TRUNCATE TABLE恢復-腳本
【轉】用EXPLAINPLAN分析SQL語(yǔ)句
oracle使用八(觸發(fā)器)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久