草庐IT

Oracle调度器Scheduler

舍旃 2023-03-28 原文

以下例子在scott用户下进行:

一、查看

先查看一下  当前用户的scheduler   的所有数据字典,看看要关注什么


SET LINE 200 PAGESIZE 2000
COL TABLE_NAME FOR A60
COL COMMENTS FOR A120
SELECT TABLE_NAME,COMMENTS FROM DICTIONARY WHERE TABLE_NAME LIKE '%USER_SCHEDULER%' ORDER BY 1;

一大堆数据字典,暂时关注其中的三个,

SELECT * FROM USER_SCHEDULER_PROGRAMS;
SELECT * FROM USER_SCHEDULER_SCHEDULES;
SELECT * FROM USER_SCHEDULER_JOBS;

 

 

 

comments里有解析,但是我有不一样的想法,具体化为一个例子:我调了个闹钟,

闹钟响起要做什么(USER_SCHEDULER_PROGRAMS),

闹钟什么时候响(USER_SCHEDULER_SCHEDULES),

闹钟是否开启(USER_SCHEDULER_JOBS);

 

关于program、schedule、job的参数请参考:DBMS_SCHEDULER (oracle.com)

二、创建

在使用scheduler之前,最好先考虑一下要做什么(为什么设置这个闹钟)

我没想好,干脆把emp表的信息插入到一个临时表中吧。

 

先在sys用户把创建表、存储过程、JOB的权限给SCOTT

grant create table to scott;
grant create procedure to scott;
grant create job to scott;

 

先创建一个临时表:

create table temp as select * from emp where 1=2;

 

创建一个存储过程,作用:找出emp表的sal>1000的所有信息,插入到temp表中。

注意:在创建此存储过程之前把 or replace去掉,防止把已存在的procedure覆盖掉。

create or replace procedure my_procedure
as
cursor my_cur is select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp where sal>1000;
begin
for i in my_cur loop
insert into temp values (i.EMPNO,i.ENAME,i.JOB,i.MGR,i.HIREDATE,i.SAL,i.COMM,i.DEPTNO);
end loop;
end;
/

 

下面创建一个scheduler.program,program_action指定上面的存储过程

begin
dbms_scheduler.create_program(
program_name=>'scott.my_program_01',
program_type=>'stored_procedure',
program_action=>'my_procedure',
enabled=>true,
comments=>'这是我的第一个scheduler.program'
);
end;
/

 

随后创建一个scheduler.schedule,为了能尽快看到效果,把FREQ指定为SECONDLY类型,INTERVAL为30秒

附:为了防止忘记关掉,结束时间设置为开始后的1小时

begin
dbms_scheduler.create_schedule(
schedule_name=>'scott.my_schedule_01',
start_date=>sysdate,
repeat_interval=>'freq=secondly;interval=30',
end_date=>sysdate+1/24,
comments=>'这是我的第一个scheduler.schedule'
);
end;
/

 

最后,创建一个job,启用按schedule计划执行program

begin
dbms_scheduler.create_job(
job_name=>'scott.my_job_01',
program_name=>'scott.my_program_01',
schedule_name=>'scott.my_schedule_01',
enabled=>TRUE,
comments=>'这是我的第一个scheduler.job'
);
end;
/

 

等一段时间,查看temp表,不出意外的话已经有数据了。

 

随后查看数据字典

SELECT * FROM USER_SCHEDULER_PROGRAMS;
SELECT * FROM USER_SCHEDULER_SCHEDULES;
SELECT * FROM USER_SCHEDULER_JOBS;

可以看到program、schedule、job的信息。

 

 

二、停止与禁用与启用

停止只跟JOB有关,就相当于闹钟响了,停止正常响着的闹钟,但是明天闹钟该响还是响。

附:闹钟响多久(JOB IS RUNNING) 取决于执行的速度;

EXEC DBMS_SCHEDULER.STOP_JOB('SCOTT.JOB');

禁用就相当于把闹钟给关了,明天这个闹钟也不响了,除非再把这个闹钟打开。

EXEC DBMS_SCHEDULER.DISABLE('SCOTT.MY_JOB_01');

与禁用相对的就是启用

EXEC DBMS_SCHEDULER.ENABLE('SCOTT.MY_JOB_01');

 

 

三、修改

嘿,计划总赶不上变化,我决定换个时间

--修改schedule的start_date为当前时间
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('SCOTT.MY_SCHEDULE_01','START_DATE',SYSDATE);
--修改schedule的end_date为一小时后 EXEC DBMS_SCHEDULER.SET_ATTRIBUTE(
'SCOTT.MY_SCHEDULE_01','END_DATE',SYSDATE+1/24);

 

四、删除

 嗐,计划取消

EXEC DBMS_SCHEDULER.DROP_JOB('SCOTT.MY_JOB_01');
EXEC DBMS_SCHEDULER.DROP_SCHEDULE('MY_SCHEDULE_01');
EXEC DBMS_SCHEDULER.DROP_PROGRAM('MY_PROGRAM_01');

 

附:存储过程my_procedure的删除和temp表一样。

有关Oracle调度器Scheduler的更多相关文章

  1. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  2. 如何判断oracle是否启动及启动oracle数据库 - 2

    plsql连接Oracle超时,完犊子了肯定是服务器断电了。得马上检查Oracle服务器状态1、检查数据库是否启动su-oracle切换到Oracle用户,输入sqlplus/assysdba显示连接状态。如果末尾显示的状态是Connectedtoanidleinstance.证明未启动2、启动数据库startup启动数据库,末尾出现Databaseopened说明数据库启动成功3、查看数据库监听是否正常先quit;断开Oracle连接,使用lsnrctlstatus查看监听状态,如果出现TNS-开头的Nolistener、Connectionrefused等错误,说明监听未启动4、启动数据库

  3. ruby - Ruby 中的大规模调度 - 2

    我需要一个用于大型动态任务集合的调度程序。目前我正在查看resque-scheduler,rufus-scheduler,和clockwork.如果您提供有关选择使用哪一个(或其他替代方案)的建议,我将不胜感激。一些细节:有大量要定期执行的任务(最多100K)。最短执行周期为1h。新任务可能会不时出现。现有任务可能会更改或删除。调度延迟最小化在这里不是关键任务(可扩展性和可持续性最重要)。任务执行不是繁重的操作,可以轻松并行。总结,我需要类似cron的Ruby项目,它可以处理大量动态变化的任务集合。更新:我花了一天时间尝试调度库,现在我想简单总结一下新获得的经验。我已经不再关注Cloc

  4. ruby - 使用 Ruby 连接到 Oracle 数据库 - 2

    我无法连接到OracleDB,阅读了很多资料但对结果没有帮助。我有远程OracleDB,我正在使用DBVisualizer设置连接连接到它,如下所示:DBType:OracleDriver(jdbc):OraclethinDatabaseURL:jdbc:oracle:thin:@10.10.100.10:1521/VVV.LOCALDOMAINUserIdf:SomeUserPass:SomePass连接正常。我在Ruby中所做的是:require'oci8'require'dbi'...conn=OCI8.new('SomeUser','SomePass','//10.10.100

  5. sql - ruby on rails 为 oracle View /函数准备的语句 - 2

    我有以下代码执行oracleView,如下所示:defrun_queryconnection.exec_query("SELECT*FROMTABLE(FN_REQRESP(#{type_param},#{search_type_param},#{tid_param},#{last_param},#{key_param},#{tran_id_param},#{num_param},#{start_date_param},#{end_date_param}))")end上述查询的输出如下:SELECT*FROMTABLE(FN_REQRESP('ALL','ALL_TRAN','1000

  6. ruby - sleep() 对于作业调度应用程序的主循环来说是个好主意吗 - 2

    我正在为我的工作用Ruby编写一个作业调度应用程序(主要是为了以给定的频率使用各种协议(protocol)移动文件)我的主循环是这样的:whiletruedo#somecodetolaunchtheproperjobsleepCONFIG["interval"]end它的工作就像一个魅力,但我不确定它是否足够安全,因为该应用程序可能在运行cpu密集型软件的服务器上运行。是否有另一种方法可以做同样的事情,或者sleep()对我来说是否足够安全? 最佳答案 每当我觉得需要阻塞时,我都会使用事件循环;通常是libev。这是一个Ruby绑定

  7. ruby - 在 resque scheduler 中调度动态作业 - 2

    我正在尝试使用rails3和resquescheduler测试future的调度作业:以下是我正在使用的代码,但我收到NoMethodErrorset_schedule。Resque.set_schedule("1",{:cron=>"306**1",:class=>"Notify",:queue=>"username",:message=>'notificationmessage'})我尝试使用简单的入队Resque.enqueue(Notify,params[:message])并且效果很好。更新:以下是我遇到的错误:undefinedmethod`set_schedule'for

  8. ruby - 尝试理解双重调度模式 - 2

    我一直在努力理解double-dispatchpattern并且很难过。我终于尝试了一个示例程序来帮助自己理解。Here's要旨。但后来我决定尝试一下withoutDoubledispatch解决方案看起来并没有比平时更糟糕。我做错了什么?编辑:根据建议,我发布了这个问题here.保留此链接以进行重定向。 最佳答案 在单一分派(dispatch)中——您在大多数现代OO语言中看到的——方法是根据单个对象的运行时类型分派(dispatch)的。这显示为点运算符(在ruby​​、java、javascript等中)或箭头运算符(perl

  9. DolphinScheduler 调度 DataX 实现 MySQL To ElasticSearch 增量数据同步实践 - 2

    数据同步的方式数据同步的2大方式基于SQL查询的CDC(ChangeDataCapture):离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据。也就是我们说的基于SQL查询抽取;无法保障数据一致性,查的过程中有可能数据已经发生了多次变更;不保障实时性,基于离线调度存在天然的延迟;工具软件以Kettle(ApacheHop最新版)、DataX为代表,需要结合任务调度系统使用。基于日志的CDC:实时消费日志,流处理,例如MySQL的binlog日志完整记录了数据库中的变更,可以把binlog文件当作流的数据源;保障数据一致性,因为binlog文件包含了所有历史变更

  10. C# 连接Oracle数据库方法 - 2

    C#连接oracle数据库常用的三种方法有三种:  一、Oracle.ManagedDataAccess.dll:Oracle官方提供的oracle数据库访问组件,不存在其他依赖dll库,推荐该方法最为重要的是:它不需要安装oracle客户端,也不区分x86位和x64位,直接就能用,连上其他电脑或者服务端oracle数据库。  二、Oracle.DataAccess.Client.dll:也叫ODP.net,是Oracle提供的数据库访问dll库。好处是:不需要安装客户端也能访问服务器上的oracle,不需要配置tnsNames.Ora文件,但是区分x86位和x64,也比较麻烦。  三、Sys

随机推荐