ITPub博客

首页 > 数据库 > Oracle > Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例-可下载

Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例-可下载

原创 Oracle 作者:leonarding 时间:2014-03-11 16:17:23 0 删除 编辑

更多精彩内容尽在


《Oracle dbms_lock.sleep()存储过程使用技巧》-场景-分析-实例-可下载


摘要:
今天是2014年3月10日,北京,雾霾,下午组织相关部门开会。会议的结尾一名开发工程师找到了我,向我请教了一下“如何延迟SQL语句的执行时间”为了是测试项目的一个功能输出。在我的建议下使用了dbms_lock.sleep()存储过程来完成了这个实现。我在会议之后体会到Oracle的package的应用场景非常重要。往往新入职场的DBA技术不错,会的东西也不少,就是不太了解什么技术应用在什么场景下,使之发挥最大的作用来帮助我们。今天借此机会来给大家分享一下dbms_lock.sleep()存储过程使用技巧。

场景:

1:存储过程中想实现延迟10分钟再继续执行

2:应用中判断条件如果在“同步”就需要等待5分钟,如果“完成”就可以无需等待

3:测试功能反馈是否正常,我们需要延迟3分钟得到SQL语句的结果和不延迟得到的SQL语句结果是否一致


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

小结:dbms_lock.sleep()过程我们在使用的时候请注意第一是权限要授予,第二是使用的场景,第三注意单位。

 《Oracle dbms_lock.sleep()存储过程使用技巧》-场景-分析-实例-可下载.pdf       请点击下载



dbms   sleep   延迟   package   leonarding 

Leonarding 刘盛

2014.03.10

北京&spring

分享技术~成就梦想

Blog:


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26686207/viewspace-1107668/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
刘盛,香港城市大学EMBA,现担任中国民生银行民生科技供应链金融事业部负责人,负责企业生态业务发展工作。 2016年8月12日刘盛受邀参加了由磐岩智慧在上海绿地万豪大酒店主办的“全球互联网金融创新论坛2016”,并作了“中国互联网金融信用体系建设与未来”主题演讲。

注册时间:2012-02-10

  • 博文量
    254
  • 访问量
    3355138