zoukankan      html  css  js  c++  java
  • 存储过程的执行延迟处理

    场景:

    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

  • 相关阅读:
    关于使用easyui dataGrid遇到的小bug问题
    构造带清除按钮的combo
    ajax方式提交数据时“+”的处理
    JavaScript call方法
    stackoverflow上的一个关于传递类对象的问题
    经典回溯算法(八皇后问题)
    c++构造函数(初始化式)被忽略的东西
    跟着<<C++Primer 学set容器>>
    排序算法(内部排序)总结
    hosts文件无法修改的问题解决方案
  • 原文地址:https://www.cnblogs.com/yhoralce/p/8016309.html
Copyright © 2011-2022 走看看