我写了一个过程,大概如下:
CREATE OR REPLACE PROCEDURE ABC.PROC_INSERT_C
IS
BEGIN
INSERT INTO C (SELECT A,B FROM D WHERE LRRQ=TO_DATE(SYSDATE,'dd.mon.yyy');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO C_ERROR VALUES (SYSDATE,'发生错误');
COMMIT;
END;
/
然后将其提交给Oracle的Job去定时执行
DECLARE
v_job number;
v_start DATE;
BEGIN
v_start := to_date(to_char(sysdate,'yyyy.mm.dd')||' 09:30:00 ','yyyy.mm.dd hh:mi:ss PM');
dbms_job.submit(v_job,'ABC.PROC_INSERT_C;',v_start,'sysdate + 1');
COMMIT;
END;
/
执行完这段语句后,可在DBA_JOBS视图中看见Oracle已经接受了我的这个任务。我直接在Oracle中运行ABC.PROC_INSERT_C向C表插数据没有问题。
但是在系统时间超过9:30后,我发现C表中没有数据,怀凝JOB没有被Oracle执行,通过查看DBA_JOBS视图,发现FAILURES列的值为4,一会后变为5,说明失败了5次了,证明Oracle的确在执行我的过程,但不知道为什么会失败,我的过程又不需要参数,而且单执行过程是正确的呀!快救救我吧!先谢了!
CREATE OR REPLACE PROCEDURE ABC.PROC_INSERT_C
IS
BEGIN
INSERT INTO C (SELECT A,B FROM D WHERE LRRQ=TO_DATE(SYSDATE,'dd.mon.yyy');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO C_ERROR VALUES (SYSDATE,'发生错误');
COMMIT;
END;
/
然后将其提交给Oracle的Job去定时执行
DECLARE
v_job number;
v_start DATE;
BEGIN
v_start := to_date(to_char(sysdate,'yyyy.mm.dd')||' 09:30:00 ','yyyy.mm.dd hh:mi:ss PM');
dbms_job.submit(v_job,'ABC.PROC_INSERT_C;',v_start,'sysdate + 1');
COMMIT;
END;
/
执行完这段语句后,可在DBA_JOBS视图中看见Oracle已经接受了我的这个任务。我直接在Oracle中运行ABC.PROC_INSERT_C向C表插数据没有问题。
但是在系统时间超过9:30后,我发现C表中没有数据,怀凝JOB没有被Oracle执行,通过查看DBA_JOBS视图,发现FAILURES列的值为4,一会后变为5,说明失败了5次了,证明Oracle的确在执行我的过程,但不知道为什么会失败,我的过程又不需要参数,而且单执行过程是正确的呀!快救救我吧!先谢了!
JOB_QUEUE_PROCESSES=4
job_queue_keep_connections=true 然后重启一个库,如果原来已经打开了则不用这步了
JOB_QUEUE_INTERVAL=10
JOB_QUEUE_PROCESSES=4但没有 job_queue_keep_connections=true 这一句。
是不是这里有问题呢?
declare
v_job binary_integer;
begin
v_job := 9;
dbms_job.run(v_job);
end;
/执行后系统返回信息:
ORA-23421 作业编号9在作业队中不是一个作业
ORA-06512 在"SYS.DBMS_SYS_ERROR",排列86
ORA-06512 在"SYS.DBMS_IJOB",525
ORA-06512 在"SYS.DBMS_JOB",254
ORA-06512 在line 5是不是我执行的不正确?
在object browser中执行此过程完全正确
提交到JOB后仍然执行失败
通过查询JOB的运行状态,结果没有记录
select sid,log_user,r.this_date,r.this_sec from dba_jobs_running r,dba_jobs j where r.job=j.job;
结果无记录
如果数据库实例处于限制模式下(restricted mode),则队列管理进程不允许调用作业执行。
只要不是在运行时,这句是不会查出结果来的。
我的机器上正常运行着一个作业,运行上面的语句也查不出结果来。
----------------------------------------- -------- ----------------------------
INSTANCE_NUMBER NUMBER
INSTANCE_NAME VARCHAR2(16)
HOST_NAME VARCHAR2(64)
VERSION VARCHAR2(17)
STARTUP_TIME DATE
STATUS VARCHAR2(7)
PARALLEL VARCHAR2(3)
THREAD# NUMBER
ARCHIVER VARCHAR2(7)
LOG_SWITCH_WAIT VARCHAR2(11)
LOGINS VARCHAR2(10)
SHUTDOWN_PENDING VARCHAR2(3)
DATABASE_STATUS VARCHAR2(17)
INSTANCE_ROLE VARCHAR2(18)
INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_TI STATUS PAR THREAD# ARCHIVE LOG_SWITCH_ LOGINS SHU DATABASE_STATUS INSTANCE_ROLE
1 mytestdb GYTAX-WLINE 8.1.7.0.0 02-1月 -05 OPEN NO 1 STOPPED ALLOWED NO ACTIVE PRIMARY_INSTANCE
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'Procdemo;',--此处为存储过程名称
SYSDATE, 'SYSDATE + 1/720');
commit;
end;
/
v_job number;
v_start DATE;
BEGIN
v_start :=to_date(to_char(sysdate,'yyyy.mm.dd') ||' 21:30:00 ', 'yyyy.mm.dd hh24:mi:ss');
dbms_job.submit(v_job,'ABC.PROC_INSERT_C();',v_start,'sysdate + 1');
COMMIT;
END;
/1、改了一下日期格式;
2、存储过程带了个括号。
BEGIN
INSERT INTO C (SELECT A,B FROM D WHERE LRRQ=TO_DATE(SYSDATE,'dd.mon.yyy');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO C_ERROR VALUES (SYSDATE,'发生错误');
COMMIT;END;
假如存为c:\script\insert.sql2、再创建一个CMD文件:内容:
sqlplus scott/tiger@ora8 @c:\script\insert.sql
把这个文件存为c:\script\job.cmd
3、最后可以利用AT这个命令来设置自动执行:
AT 21:30 /every:M,T,W,Th,F,S,Su "c:\script\job.cmd"
Fri Dec 31 21:52:56 2004
Errors in file D:\oracle\admin\mydb\bdump\mydbSNP3.TRC:
ORA-12012: error on auto execute of job 24
ORA-06550: line 1, column 96:
PLS-00201: 必须说明标识符 'ABC.PROC_INSERT_C'
ORA-06550: line 1, column 96:
PL/SQL: Statement ignored但是我用ABC登录数据库执行PROC_INSERT_C结果正确,我想是不是与我用SYSTEM用户执行的DBMS_JOB.SUBMIT有关,这样的话在USER_JOBS视图中就找不到what='ABC.PROC_INSERT_C'的记录,只有在DBA_JOBS视图中才可以找到。
创建测试表
SQL> create table a(a date);
表已创建。
创建一个自定义过程
SQL> create or replace procedure test as
2 begin
3 insert into a values(sysdate);
4 end;
5 /
过程已创建。
创建JOB
SQL> variable job1 number;
SQL> begin
2 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
3 end;
4 /
PL/SQL 过程已成功完成。
运行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /
PL/SQL 过程已成功完成。
SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;
时间
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24删除JOB
SQL> begin
2 dbms_job.remove(:job1);
3 end;
4 /
PL/SQL 过程已成功完成。看以上是否能正常运行,如果可以就从你的程序找问题吧,不行就得从数据库找问题。
再过一天就结贴。