zoukankan      html  css  js  c++  java
  • 在PL/SQL中如何让程序暂停几秒钟

    在编写PL/SQL中,有时需要程序中暂停几秒钟再继续执行,查了一下,oracle内置有这个功能dbms_lock.sleep(10);不过dbms_lock包需要用户自己安装,演示如下:

    [sql] view plain copy
     
    1. C:Documents and Settingsandyleng>sqlplus /nolog  
    2.   
    3. SQL*Plus: Release 11.2.0.1.0 Production on Thu Nov 10 10:04:56 2011  
    4.   
    5. Copyright (c) 1982, 2010, Oracle.  All rights reserved.  
    6.   
    7. SQL> conn /as sysdba  --以SYSDBA身份登陆  
    8. Connected.  
    9. SQL> @?/rdbms/admin/dbmslock.sql --安装系统包  
    10.   
    11. Package created.  
    12.   
    13.   
    14. Synonym created.  
    15.   
    16.   
    17. Grant succeeded.  
    18.   
    19. SQL> grant execute on dbms_lock to public; --授权PUBLIC执行权限  
    20.   
    21. Grant succeeded.  
    22.   
    23. SQL> create table test1(id number,name varchar2(40),time date);   --创建test1临时表  
    24.   
    25. Table created.  
    26.   
    27. SQL> select * from test1;  --无数据  
    28.   
    29. no rows selected  
    30.   
    31.   
    32. SQL> SET TIMING ON  --打开时间显示  
    33. SQL> begin  --开始执行测试脚本  
    34.   2    insert into test1(id,name,time) values(1,'Andy',sysdate);  
    35.   3    DBMS_LOCK.SLEEP(10);  --让程序暂时10秒钟  
    36.   4    insert into test1(id,name,time) values(2,'Shirley',sysdate);  
    37.   5    commit;  
    38.   6  end;  
    39.   7  /  
    40.   
    41. PL/SQL procedure successfully completed.  
    42.   
    43. Elapsed: 00:00:10.04  --程序执行时间为10.04秒  
    44.   
    45.   
    46. SQL> SELECT ID,NAME,TO_CHAR(TIME,'YYYY/MM/DD HH24:MI:SS') AS TIME FROM TEST1; --查询执行结果  
    47.   
    48.         ID NAME                                     TIME  
    49. ---------- ---------------------------------------- -------------------  
    50.          1 Andy                                     2011/11/10 10:09:03   --第一条的插入时间是09:03  
    51.          2 Shirley                                  2011/11/10 10:10:13   --第二条的插入时间是09:13,刚好比第一条晚了10秒钟  
    52.   
    53.   
    54. Elapsed: 00:00:00.00  
    55.   
    56.   
    57. SQL> drop table test1;  
    58.   
    59. Table dropped.  


     

     自定义EXCEPTION 和GOTO的用法:

    [sql] view plain copy
     
      1. -- Create the procedure to loop del users.  
      2. CREATE OR REPLACE PROCEDURE QA2_ATGCORE_MF.delBigTab  
      3. AS  
      4.        PRAGMA AUTONOMOUS_TRANSACTION;  
      5.        p_Count   NUMBER := 1000;  
      6.        n_delete number:=0;  
      7.        start_time date:=sysdate;  
      8.        end_time date;  
      9.        var_usergroup number;  
      10.        e_nowait EXCEPTION;--自定义exception  
      11.        PRAGMA EXCEPTION_INIT(e_nowait,-00054);--初使化该exception到“ORA-00054”的错误代码  
      12. BEGIN  
      13.    <<restart>>--程序标签  
      14.    WHILE 1 = 1  
      15.    LOOP  
      16.            begin  
      17.                   var_usergroup:=QA2_ATGCORE_MF.DEL_USERGROUP_SEQ.nextval;  
      18.                   EXECUTE IMMEDIATE  
      19.                      'update QA2_ATGCORE_MF.DPS_USER_DEL_TEMP set usergroup_id=:usergroup,del_flag=''1'',del_time=sysdate where del_flag=''0'' and rownum <=:rn'  
      20.                      USING var_usergroup,P_COUNT;  
      21.                   IF (SQL%NOTFOUND)  
      22.                      OR (TO_CHAR (SYSDATE, 'hh24mi') BETWEEN '0600' AND '1200')  
      23.                   THEN  
      24.                      EXIT;  
      25.                   ELSE  
      26.                      n_delete:=n_delete + SQL%ROWCOUNT;  
      27.                      QA2_ATGCORE_MF.DEL_USERGROUP(var_usergroup);  
      28.                   END IF;  
      29.                   COMMIT;             
      30.            EXCEPTION  
      31.                 WHEN e_nowait THEN  
      32.                    DBMS_LOCK.SLEEP(2););--出现ORA-00054的错误时先等待2秒钟  
      33.                    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS')||SQLCODE||':'||SQLERRM||' I am go to restart' );  
      34.                    GOTO restart;--出现ORA-00054的错误时跳转到restart处重新执行该程序  
      35.                WHEN OTHERS THEN  
      36.                    ROLLBACK;  
      37.                    RAISE;  
      38.            END;  
      39.              
      40.    END LOOP;  
      41.    COMMIT;  
      42.    end_time:=sysdate;  
      43.    DBMS_OUTPUT.PUT_LINE('***************************************************************************');  
      44.    DBMS_OUTPUT.PUT_LINE('Totally delete '||to_char(n_delete)||' users! Used time:'||numtodsinterval (end_time-start_time,'DAY'));  
      45.    DBMS_OUTPUT.PUT_LINE('***************************************************************************');  
      46. END;  
      47. /  
  • 相关阅读:
    ▶ 0001 No application 'E:wwwgolog' found in your GOPATH
    beego路由
    go sync.WaitGroup
    idea修改filetype
    deepin添加设置快捷键
    mysql数据库被攻击
    linux桌面系统的约定
    deepin把vscode设为默认文本应用
    linux应用管理
    当你在工作中失去动力时该怎么办?
  • 原文地址:https://www.cnblogs.com/youngerger/p/8579544.html
Copyright © 2011-2022 走看看