利用DBMS_SCHEDULER、DBMS_AQ、DBMS_ADADM實現基於時間和基於事件的自動執行任務
一、建立基於時間的作業
1)建立表t1
SQL> create table t1 (id number(10));
表已建立。
2)建立儲存過程tt
SQL> create procedure tt as
2 begin
3 insert into t1 values(2);
4 commit;
5 end;
6 /
過程已建立。
3)建立程式use_tt
SQL> begin
2 dbms_scheduler.create_program(
3 program_name=>'SCOTT.use_tt',
4 program_action=>'SCOTT.TT',
5 program_type=>'STORED_PROCEDURE',
6 number_of_arguments=>0,
7 comments=>'',
8 enabled=>TRUE);
9 end;
10 /
PL/SQL 過程已成功完成。
4)建立計劃use_tt_1
SQL> begin
2 dbms_scheduler.create_schedule(
3 repeat_interval=>'FREQ=SECONDLY;INTERVAL=5',
4 start_date=>systimestamp at time zone '+6:00',
5 schedule_name=>'"SCOTT"."USE_TT_1"');
6 end;
7 /
PL/SQL 過程已成功完成。
5)建立作業tt_job
SQL> begin
2 dbms_scheduler.create_job(
3 job_name=>'"SCOTT"."TT_JOB"',
4 program_name=>'SCOTT.USE_TT',
5 schedule_name=>'SCOTT.USE_TT_1',
6 job_class=>'DEFAULT_JOB_CLASS',
7 auto_drop=>FALSE,
8 enabled=>TRUE);
9 end;
10 /
PL/SQL 過程已成功完成。
6)檢視job資訊
SQL> col job_name format a15;
SQL> col program_name format a15;
SQL> col schedule_name format a15;
SQL> select job_name, program_name, schedule_name from user_scheduler_jobs;
JOB_NAME PROGRAM_NAME SCHEDULE_NAME
--------------- --------------- ---------------
TT_JOB USE_TT USE_TT_1
檢視執行job的動態資訊,發現被執行了140次
SQL>SELECT COUNT(1) FROM USER_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='TT_JOB';
COUNT(1)
----------
140
檢視t1表,發現不斷有資料插入
SQL> select count(*) from t1;
COUNT(*)
----------
145
二、建立基於事件的作業
1)建立表event_t
SQL> create table event_t(event_ varchar2(100));
表已建立。
2)建立型別t_event_q,用於說明訊息在佇列中存放的格式
SQL> create or replace type t_event_q as object(
2 object_owner varchar2(50),event_name varchar2(50));
3 /
型別已建立。
3)建立佇列表event_q
SQL> begin
2 dbms_aqadm.create_queue_table(
3 queue_table=>'event_q',
4 queue_payload_type=>'t_event_q',
5 multiple_consumers=>true);
6 end;
7 /
PL/SQL 過程已成功完成。
4)建立佇列e_q,並啟動佇列
SQL> begin
2 dbms_aqadm.create_queue(
3 queue_name=>'e_q',
4 queue_table=>'event_q');
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> exec dbms_aqadm.start_queue(queue_name=>'e_q');
PL/SQL 過程已成功完成。
5)建立儲存過程t2
SQL>create or replace procedure t2 as
2 begin
3 insert into event_t values('event has recevie');
4 commit;
5 end;
6 /
過程已建立。
6)建立程式use_t2
SQL> begin
2 dbms_scheduler.create_program(
3 program_name=>'SCOTT.use_t2',
4 program_action=>'SCOTT.T2',
5 program_type=>'STORED_PROCEDURE',
6 number_of_arguments=>0,
7 comments=>'',
8 enabled=>TRUE);
9 end;
10 /
PL/SQL 過程已成功完成。
7)建立作業event_job
SQL> begin
2 dbms_scheduler.create_job(
3 job_name=>'"SCOTT"."EVENT_JOB"',
4 program_name=>'SCOTT.USE_T2',
5 event_condition=>'tab.user_data.object_owner=''SCOTT''
6 and tab.user_data.event_name=''give_me_an_event''',
7 queue_spec=>'SCOTT.E_Q',
8 job_class=>'DEFAULT_JOB_CLASS',
9 auto_drop=>FALSE,
10 enabled=>TRUE);
11 end;
12 /
PL/SQL 過程已成功完成。
8)發出事件
SQL> declare
2 aa dbms_aq.enqueue_options_t;
3 bb dbms_aq.message_properties_t;
4 cc raw(16);
5 dd t_event_q;
6 begin
7 dd:=t_event_q('SCOTT','give_me_an_event');
8 dbms_aq.enqueue(
9 queue_name=>'e_q',
10 enqueue_options=>aa,
11 message_properties=>bb,
12 payload=>dd,
13 msgid=>cc);
14 end;
15 /
PL/SQL 過程已成功完成。
9)檢視結果
SQL> commit;
提交完成。
SQL> select * from event_t;
EVENT_
----------------------------------------
event has recevie
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24104518/viewspace-713330/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於redis實現定時任務Redis
- 基於REDIS實現延時任務Redis
- 基於Mybatis-Plus實現自動化操作建立時間和修改時間MyBatis
- 基於spring實現事件驅動Spring事件
- 使用EventNext實現基於事件驅動的業務處理事件
- 基於Azkaban的任務定時排程實踐
- 資料排程元件:基於Azkaban協調時序任務執行元件
- 基於Mongodb分散式鎖簡單實現,解決定時任務併發執行問題MongoDB分散式
- 利用人工智慧實現基於影像的自動化檢查人工智慧
- 基於RestAssured實現介面自動化REST
- 【c#】分享一個簡易的基於時間輪排程的延遲任務實現C#
- .Net Core實現基於Quart.Net的任務管理
- 基於Java反射的定時任務設計Java反射
- PHP定時執行任務的實現PHP
- 基於C++11的執行緒池實現C++執行緒
- 基於percona xtrabackup之innobackupex實現基於時間點資料庫恢復資料庫
- Springboot實現基於字首的自定義配置和自動提示功能Spring Boot
- 使用Rqueue框架基於Redis和Spring Boot執行非同步任務 -sonus21框架RedisSpring Boot非同步
- 基於訊息佇列(RabbitMQ)實現延遲任務佇列MQ
- Oracle定時任務dbms_schedulerOracle
- 基於rust實現的事件系統,支援同步和非同步Rust事件非同步
- 基於日出和日落時間自動切換到明/暗 Gtk 主題
- 基於Laravel框架定時任務相關實現方法及操作注意事項Laravel框架
- 基於Guava API實現非同步通知和事件回撥GuavaAPI非同步事件
- 【web服務】耗時任務基於API與worker模式WebAPI模式
- 構建一個基於事件分發驅動的EventLoop執行緒模型事件OOP執行緒模型
- 基於 LangChain 的自動化測試用例的生成與執行LangChain
- 基於Spring Cloud Netflix的TCC柔性事務和EDA事件驅動示例SpringCloud事件
- Java + SikuliX 基於影像實現自動化測試Java
- 基於Liquid State Machine的時間序列預測:利用儲備池計算實現高效建模UIMac
- 基於asyncio和redis的Python分散式任務佇列RedisPython分散式佇列
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 使用TypeScript和nextjs實現基於CQRS的微服務的銀行API原始碼TypeScriptNextJS微服務API原始碼
- Procrastinate:基於PostgreSQL的Python任務佇列ASTSQLPython佇列
- 關於MySql 設定一個間隔時間 執行一個事件MySql事件
- 智慧提醒助手——基於HarmonyOS Next的多場景後臺任務實現
- 基於 ASK + EB 構建容器事件驅動服務事件
- 基於DotNetty實現自動釋出 - 專案的配置與發現Netty
- 基於PaddlePaddle的詞向量實戰 | 深度學習基礎任務教程系列深度學習