存儲過程的執行延遲處理


場景:

1:存儲過程中想實現延遲10分鍾再繼續執行

2:應用中判斷條件如果在“同步”就需要等待5分鍾,如果“完成”就可以無需等待

3:測試功能反饋是否正常,我們需要延遲3分鍾得到SQL語句的結果和不延遲得到的SQL語句結果是否一致

重點:dbms_lock.sleep()過程我們在使用的時候請注意第一是權限要授予,第二是使用的場景,第三注意單位

簡單用法:

BEGIN
  FOR I IN 1 .. 3 LOOP dbms_output.put_line(to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')); --每5秒鍾執行一次
    DBMS_LOCK.SLEEP(5); END LOOP; END;

 

延遲插入EMP表:

BEGIN
  FOR I IN 1 .. 3 LOOP INSERT INTO EMP (EMPNO, HIREDATE) VALUES (I, SYSDATE); COMMIT; --每5秒鍾執行一次
    DBMS_LOCK.SLEEP(5); END LOOP; END;

 

dbms_lock包:

1.這個package是Oracle提供的一個鎖管理服務包,它具有創建一個鎖,請求鎖的狀態,釋放一個鎖資源等功能。一般使用dbca創建的數據庫默認就有這個包,如果是手工建庫的話需要執行$ORACLE_HOME/rdbms/admin/dbmslock.sql這個腳本來創建這個package。創建之后數據庫中才能有這個包對象。

注意:只有授予執行權限才能使用

使用SYS用戶授予權限

grant execute on dbms_lock to USERNAME;

2.查看dbms_lock包內容

SQL> desc dbms_lock

Element         Type     

--------------- ---------

NL_MODE         CONSTANT 

SS_MODE         CONSTANT 

SX_MODE         CONSTANT 

S_MODE          CONSTANT 

SSX_MODE        CONSTANT 

X_MODE          CONSTANT 

MAXWAIT         CONSTANT 

ALLOCATE_UNIQUE PROCEDURE     給鎖分配一個唯一的標識符

REQUEST         FUNCTION      請求一個鎖的模式(獲取鎖的狀態值)

CONVERT         FUNCTION      將鎖從一個狀態轉換成另一個狀態

RELEASE         FUNCTION       釋放鎖

SLEEP           PROCEDURE      這是實現延遲時間的存儲過程,可以指定睡眠時間間隔

本文章主要講解SLEEP PROCEDURE。

 

DBMS_LOCK.SLEEP()存儲過程:

作用:使用這個存儲過程可以中止會話一段時間

語法:DBMS_LOCK.SLEEP (seconds IN NUMBER);  單位為“秒”,最小的增量可以百分之一秒

例如:DBMS_LOCK.SLEEP (1.95);是一個合法的值

 

Example:

(1)由於是一個存儲過程可以直接使用

SQL> execute dbms_lock.sleep(60);

PL/SQL procedure successfully completed

SQL> select * from pb_tradeinfo where rownum<=3;

IID       TRADEID       NAME          CERTTYPE

--------------------- --------------------- ----------------------------------

382       548          一次性還款          0

415       563          測試一次性貸款      2

423       569          測試                1

 

(2)PL/SQL塊實現延遲60秒

SQL> begin

  2  dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));

  3  dbms_lock.sleep(60);

  4  dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));

  5  end;

  6  /

 

2014-03-10 20:41:56

2014-03-10 20:42:56

 

PL/SQL procedure successfully completed

 

(3)打印間隔5秒時間列表

創建測試表

SQL> create table leonarding (iid number,appendtime date);

Table created

開始測試

SQL> begin

  2       for i in 1..10

  3       loop

  4           insert into leonarding values(i,sysdate);

  5           commit;

  6           dbms_lock.sleep(5);

  7       end loop;

  8  end;

  9  /

PL/SQL procedure successfully completed

打印列表

SQL> select * from leonarding;

       IID APPENDTIME

---------- --------------------------------------------------

         1 2014-3-10 20:51:20

         2 2014-3-10 20:51:25

         3 2014-3-10 20:51:30

         4 2014-3-10 20:51:35

         5 2014-3-10 20:51:40

         6 2014-3-10 20:51:45

         7 2014-3-10 20:51:50

         8 2014-3-10 20:51:55

         9 2014-3-10 20:52:00

        10 2014-3-10 20:52:05

10 rows selected

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM