Oracle dbms_lock.sleep()儲存過程使用技巧-場景-分析-例項-可下載

leonarding發表於2014-03-11

更多精彩內容盡在www.leonarding.com


《Oracle dbms_lock.sleep()儲存過程使用技巧》-場景-分析-例項-可下載


摘要:
今天是2014310日,北京,霧霾,下午組織相關部門開會。會議的結尾一名開發工程師找到了我,向我請教了一下“如何延遲SQL語句的執行時間”為了是測試專案的一個功能輸出。在我的建議下使用了dbms_lock.sleep()儲存過程來完成了這個實現。我在會議之後體會到Oraclepackage的應用場景非常重要。往往新入職場的DBA技術不錯,會的東西也不少,就是不太瞭解什麼技術應用在什麼場景下,使之發揮最大的作用來幫助我們。今天藉此機會來給大家分享一下dbms_lock.sleep()儲存過程使用技巧。

場景:

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

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

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


dbms_lock包:

1.這個packageOracle提供的一個鎖管理服務包,它具有建立一個鎖,請求鎖的狀態,釋放一個鎖資源等功能。一般使用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

 

2PL/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

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

 《Oracle dbms_lock.sleep()儲存過程使用技巧》-場景-分析-例項-可下載.pdf       請點選下載



dbms   sleep   延遲   package   leonarding 

Leonarding 劉盛

2014.03.10

北京&spring

分享技術~成就夢想

Blogwww.leonarding.com


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-1107668/,如需轉載,請註明出處,否則將追究法律責任。

相關文章