创建 序列 存储过程 job

掌握了 oracle中的 dbms_lock 函数,该函数 主要用于暂停执行的程序 

1.用意

写job 以10分钟 为单元,前10分钟 从 1到10 插入测试表, 中间10分钟从 11到20插入测试表, 最后10分钟 从 21到30插入测试表.

 

2.处理方法

2.1 创建序列.  初始值 1  增量 1 最大值无限制

2.2 创建存储过程, 利用for循环顺序读取序列的nextval 插入 测试表.for循环中需要添加 sleep参数

2.3 创建job. 定期调用 存储过程, 参数repeat_interval    => 'FREQ=daily;INTERVAL=1',

 /* every  day*/

2.4 创建测试表

 

3.创建测试表

SYS @ prod > CREATE TABLE TEST01(N1 DATE,N2 NUMBER);

Table created.

4.创建序列

--创建序列.  初始值 1  增量 1 最大值无限制

SYS @ prod >CREATE SEQUENCE MY_SEQ01 START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;

 

Sequence created.

 

5.创建存储过程

--创建存储过程, 利用for循环顺序读取序列的nextval 插入 测试表.for循环中需要添加 sleep参数

SYS @ prod > CREATE OR REPLACE PROCEDURE BATCH_INSERT01 

    AS

        BEGIN

        FOR I IN 1..90 LOOP

        INSERT INTO TEST01 VALUES(SYSDATE,MY_SEQ01.NEXTVAL);

        COMMIT;

        DBMS_LOCK.SLEEP(60);

        END LOOP;

        END;

   /

 

Procedure created.

 

6.测试存储过程

SYS @ prod >exec BATCH_INSERT01;

 

PL/SQL procedure successfully completed.

 

7.创建 job

方法一:

SYS @ prod > DECLARE

  BEGIN

  DBMS_SCHEDULER.CREATE_JOB(

  JOB_NAME =>'JOB_BATCH_INSERT01',

  JOB_TYPE =>'STORED_PROCEDURE',

  JOB_ACTION =>'BATCH_INSERT01',

  START_DATE =>SYSDATE,

  REPEAT_INTERVAL    => 'FREQ=MINUTELY;INTERVAL=1',        /* EVERY  MINUTE*/

  ENABLED=> TRUE,

  AUTO_DROP=> FALSE,

--  END_DATE           =>  ' 25-AUG-15 2.00.00 PM ',

  COMMENTS           =>  'MY NEW JOB');

  END;

  /

 

PL/SQL procedure successfully completed.

 

8.强制命令程序暂停

--暂停10秒调用  DBMS_LOCK函数强制使程序暂停

BEGIN

DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));

DBMS_LOCK.sleep(10);

DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));

END;

 

2015-09-08 11:16:17

2015-09-08 11:16:27

 

9.运行job(不需要运行操作,因为job到指定时间会自动运行哦)

SYS @ prod >exec DBMS_SCHEDULER.RUN_JOB(JOB_NAME=>' job_batch_insert01');

 

PL/SQL procedure successfully completed.

 

10.查看对应包

包中分别包含了 运行job、删除job等存储过程

SYS @ prod >desc DBMS_SCHEDULER;

 

PROCEDURE RUN_JOB

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 JOB_NAME                       VARCHAR2                IN

 USE_CURRENT_SESSION            BOOLEAN                 IN     DEFAULT

 

 PROCEDURE DROP_JOB

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 JOB_NAME                       VARCHAR2                IN

 FORCE                          BOOLEAN                 IN     DEFAULT

 

11.删除job

首先停止job

SQL> EXEC DBMS_SCHEDULER.STOP_JOB(JOB_NAME=>'JOB_BATCH_INSERT01');

 

PL/SQL procedure successfully completed.

 

再删除job

SYS @ prod > EXEC DBMS_SCHEDULER.DROP_JOB(job_name=>'job_batch_insert01');

 

PL/SQL procedure successfully completed.

12.检查结果

检查 测试表中的数据在增加

SQL> SELECT * FROM TEST01;

 

 

但是 查询 dba_jobs、user_jobs、all_jobs 没有任何信息

 

SQL> select * from dba_jobs;

 

SQL> select * from user_jobs;

 

no rows selected

 

SQL> select * from dba_jobs_running;

 

no rows selected

只在all_scheduler_job_log 中看到该job 运行的相关信息

SQL> set linesize 1000

SQL> set pagesize 1000

SQL> col log_date for a40

SQL> col job_name for a30

SQL> select log_date,job_name,status,destination  from all_scheduler_job_log order by log_date desc;

LOG_DATE                                 JOB_NAME                       STATUS               DESTINATION

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

09-9月 -15 09.25.30.060000 上午 +08:00      JOB_BATCH_INSERT01                 SUCCEEDED

13.删除 序列、job、存储过程

SYS @ PROD >DROP PROCEDURE BATCH_INSERT01;

PROCEDURE DROPPED.

SYS @ PROD >DROP SEQUENCE MY_SEQ01;

SEQUENCE DROPPED.

SYS @ PROD >EXEC DBMS_SCHEDULER.DROP_JOB(JOB_NAME=>'JOB_BATCH_INSERT01');

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.

记录一下(以下为测试过程中用到的sql语句)

Plsql创建job

begin

  sys.dbms_scheduler.create_job(job_name            => 'SJBDZFP.JOB_INSERT_TEST',

                                job_type            => 'STORED_PROCEDURE',

                                job_action          => 'sjbdzfp.insert_test',

                                start_date          => to_date('15-07-2015 10:00:00', 'dd-mm-yyyy hh24:mi:ss'),

                                repeat_interval     => 'Freq=Minutely;Interval=2',

                                end_date            => to_date('15-07-2015 12:00:00', 'dd-mm-yyyy hh24:mi:ss'),

                                job_class           => 'DBMS_JOB$',

                                enabled             => true,

                                auto_drop           => false,

                                comments            => 'My new job');

end;

/

副本1

create table test01 (n1 date,n2 number);

 

DROP TABLE TEST01 PURGE;

 

CREATE SEQUENCE MY_SEQ01 START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;

 

SELECT * FROM MY_SEQ01.NEXTVAL FROM DUAL;

 

DROP SEQUENCE MY_SEQ01;

 

CREATE OR REPLACE PROCEDURE BATCH_INSERT01 

    AS

        BEGIN

        FOR I IN 1..90 LOOP

        INSERT INTO TEST01 VALUES(SYSDATE,MY_SEQ01.NEXTVAL);

        COMMIT;

        DBMS_LOCK.SLEEP(60);

        END LOOP;

        END BATCH_INSERT01 ;

 

DECLARE

  BEGIN

  DBMS_SCHEDULER.CREATE_JOB(

  JOB_NAME =>'JOB_BATCH_INSERT01',

  JOB_TYPE =>'STORED_PROCEDURE',

  JOB_ACTION =>'BATCH_INSERT01',

  START_DATE =>SYSDATE,

  REPEAT_INTERVAL    => 'FREQ=MINUTELY;INTERVAL=1',        /* EVERY DAY */

  ENABLED=> TRUE,

  AUTO_DROP=> FALSE,

--  END_DATE           =>  ' 25-AUG-15 2.00.00 PM ',

  COMMENTS           =>  'MY NEW JOB');

  END;

 

begin

   DBMS_SCHEDULER.RUN_JOB(JOB_NAME=>'job_batch_insert01',USE_CURRENT_SESSION =>true);

   end;

  

BEGIN

  DBMS_SCHEDULER.job_stopped('job_batch_insert01');

  END;

副本2

SELECT * FROM TEST01 ORDER BY N2 ASC;

 

DELETE FROM TEST01 ;

 

BEGIN

  DBMS_SCHEDULER.stop_job('job_batch_insert01');

  END;

 

 

BEGIN

  DBMS_SCHEDULER.job_disabled('job_batch_insert01');

  END;

 

BEGIN

  DBMS_SCHEDULER.drop_job('job_batch_insert01');

  END;

原文地址:https://www.cnblogs.com/iyoume2008/p/4794435.html