存储过程的执行延迟处理
场景:
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