oraclejobsql
① oracle写一个定时执行的sql语句,JOB也行
关于定期执行的计划任务,oracle中可以通过dbms_scheler包中的自带的存储过程进行实现;如果需要将查询结果存入指定的目录,需要考虑数据转换,相对复杂,一般通过前端软件实现;
② Oracle数据库job,调用存储过程,PLSQL工具执行后,没有报错,但是也没有任何效果,哪位大神帮忙分析一下
SQL> create or replace procere test_jobproce as
2
3 begin
4
5 insert into test_job values(sysdate);
6
7 end test_jobproce;
8
9 /
警告: 创建的过程带有编译错误。
SQL> show errors;
PROCEDURE TEST_JOBPROCE 出现错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1 PL/SQL: SQL Statement ignored
5/13 PL/SQL: ORA-00942: 表或视图不存在
SQL> create table test_job (t1 date);
表已创建。
SQL> create or replace procere test_jobproce as
2
3 begin
4
5 insert into test_job values(sysdate);
6
7 end test_jobproce;
8 /
过程已创建。
SQL> declare test_job_really number;
2 begin
3 dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440')
4 commit;
5 end;
6 /
PL/SQL 过程已成功完成。
SQL> rpitn :test_job_really;
SP2-0734: 未知的命令开头 "rpitn :tes..." - 忽略了剩余的行。
SQL> print :test_job_really;
SP2-0552: 未声明绑定变量 "TEST_JOB_REALLY"。
SQL> desc dba_jobs;
名称 是否为空? 类型
----------------------------------------- -------- ---------------------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)
MISC_ENV RAW(32)
INSTANCE NUMBER
SQL> select job ,what from dba_jobs;
JOB
----------
WHAT
-------------------------------------------------------------------------------
4001
wwv_flow_cache.purge_sessions(p_purge_sess_older_then_hrs => 24);
4002
wwv_flow_mail.push_queue(wwv_flow_platform.get_preference('SMTP_HOST_ADDRESS'),
wv_flow_platform.get_preference('SMTP_HOST_PORT'));
3
test_jobproce;
JOB
----------
WHAT
-------------------------------------------------------------------------------
SQL> exec dbms_job.run(3);
PL/SQL 过程已成功完成。
SQL> select * from test_job
2 ;
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> exec dbms_job.run(3);
PL/SQL 过程已成功完成。
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
SQL> exec dbms_job.run(3);
PL/SQL 过程已成功完成。
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
05-3月 -14
SQL>
③ Oracle中如何定时执行一条SQL语句
通过网上查询,找到一种方案,就是先在oracle里面对要定时的sql写成存储过程,再用DBMS_scheler对存储过程进行定时执行。
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在PLSQL中,执行下面语句模拟存储过程的调用,执行后要点提交才有反应
[sql] view plain
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
GrantCreateJobTo指定用户名
SQL>CREATEORREPLACEPROCEDURE
JOB_TEST
BEGIN
INSERTINTOMY_JOB_TEST(NUM)VALUES(1);
END;
- (此处要执行存储过程不能用exec JB_TEST,这种执行方式只能在命令行中使用)
SQL>BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'SCHEDULER_TEST',
job_type=>'STORED_PROCEDURE',
job_action=>'JOB_TEST',
start_date=>sysdate,
repeat_interval=>'FREQ=MINUTELY;INTERVAL=1');
END;
- 但是这样子定时任务并不会执行。
SQL>SELECT*FROMUSER_SCHEDULER_JOBS;
- 此时我们可以看到enable的状态是false的,因此我们需要去启动定时任务
SQL>BEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
然后下面建立一个存储过程JOB_TEST
(注意,这里用户需要CREATE JOB权限,可以用超级管理员用户执行下面语句给指定用户赋予该权限)
[sql] view plain
[sql] view plain
使用DBMS_SCHEDULER进行定时,这里为每分钟执行一次
[sql] view plain
我们可以用下面的命令查看一下scheler的状态
[plain] view plain
[plain] view plain
dbms_scheler.enable('j_test'); --启用jobs
dbms_scheler.disable('j_test'); --禁用jobs
dbms_scheler.run_job('j_test'); --执行jobs
dbms_scheler.stop_job('j_test'); --停止jobs
dbms_scheler.drop_job('j_test'); --删除jobs
然后再查询job的enable装态,发现为true了。
然后查看MY_JOB_TEST表,发现每分钟会往里面添加记录。
当需要修改定时任务或者调度的其他属性时,可以用下面的
dbms_scheler.set_attribute('调度名','调度属性','调度值');
至此,定时任务完成。
④ oracle job 能否用sql语句控制时间
可以的!
参考如下代码
FOR P_JOB IN (SELECT *
FROM USER_JOBS
WHERE WHAT LIKE 'EXEC_PROCEDURE%;'
AND WHAT ! = 'EXEC_PROCEDURE_START;'
AND BROKEN = 'N') LOOP
BEGIN
DBMS_JOB.CHANGE(JOB => P_JOB.JOB,
WHAT => NULL,
NEXT_DATE => SYSDATE + P_TIME / 1440,
INTERVAL => NULL);
COMMIT;
END;
P_TIME := P_TIME + 1;
END LOOP;
⑤ oracle如何查询和停止正在运行的job
找出正在执行的JOB编号及其会话编号 SELECT SID,JOB FROM DBA_JOBS_RUNNING; 停止该JOB的执行 SELECT SID,SERIAL# FROM V$SESSION WHERE SID='&SID' ALTER SYSTEM KILL SESSION '&SID,&SERIAL' EXEC DBMS_JOB.BROKEN(&JOB,TRUE);实例分析:1,查询正在运行的Job,通过查询有两个,和进程占用较多的是两个ORACLE进程符合。SQL> SELECT SID,JOB FROM DBA_JOBS_RUNNING; SID JOBx0dx0a---------- ----------12 11616 1172,查询正在运行的job的信息SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE SID=' SID SERIAL#x0dx0a---------- ----------x0dx0a12 4SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE SID=ཌ' SID SERIAL#x0dx0a---------- ----------x0dx0a16 13,利用查询出来的job信息将job结束掉SQL> ALTER SYSTEM KILL SESSION ,4'System altered.SQL> ALTER SYSTEM KILL SESSION ཌ,1'System altered.x0dx0a4,如果不希望运行上述job的话,可以将job设置为broken.EXEC DBMS_JOB.BROKEN(116,TRUE);EXEC DBMS_JOB.BROKEN(117,TRUE);
⑥ 我想定时让 oracle 执行一段sql语句 怎么做
如:定时删除三分钟前的数据
###1.创建存储过程
SQL>createorreplaceprocerepro_delete_aas
2begin
3deletefromatwheret.a<(sysdate-3/1440);###一天1440分钟。即一分钟是1/1440
4end;
5/
Procerecreated
###2创建job
SQL>variablejob_pro_delete_anumber;
SQL>begin
2dbms_job.submit(:job_pro_delete_a,'pro_delete_a;',sysdate,'sysdate+3/1440');
3end;
4/
PL/
job_pro_delete_a
---------
127
###3.调用job
SQL>begin
2dbms_job.run(:job_pro_delete_a);
3end;
4/
PL/
job_pro_delete_a
---------
127
###4.删除job
SQL>begin
2dbms_job.remove(:job_pro_delete_a);
3end;
4/
Ps:select*fromuser_jobs;
dbms_job.remove(ID);
⑦ oracle job 时间每五分钟执行怎么写
oracle job 时间每五分钟执行:
begin
sys.dbms_job.submit(job => :job,
what => '一个存储过程;',
Interval =>TRUNC(sysdate,'mi') + 5/ (24*60));
commit;
end;
其中:如果改成TRUNC(sysdate,'mi')+ 10/ (24*60) 就是每10分钟执行次。每秒钟执行次:Interval => sysdate+ 1/(24 * 60 * 60)。如果改成sysdate + 10/(24 *60 * 60)就是10秒钟执行次。
使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse:
1、job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。
2、what参数是将被执行的PL/SQL代码块,存储过程名称等。
3、next_date参数指识何时将运行这个工作。
4、interval参数何时这个工作将被重执行。
5、no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
(7)oraclejobsql扩展阅读:
1、每天定时执行
例如:每天的凌晨1点执行
Interval =>TRUNC(sysdate) + 1 +1/ (24)
2、每周定时执行
例如:每周一凌晨1点执行:
Interval =>TRUNC(next_day(sysdate,'星期一'))+1/24
3、每月定时执行
例如:每月1日凌晨1点执行:
Interval=>TRUNC(LAST_DAY(SYSDATE))+1+1/24
4、每季度定时执行
例如每季度的第一天凌晨1点执行:
Interval =>TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24