你手工修改了spfile(sid).ora文件并在里添加了参数job_queue_interval=10, 启动数据库肯定失败啦!!!spfile(sid).ora是一个二进制文件,不允许手工修改。 要想修改参数,必须在startup数据库以后,使用alter system或 alter session命令,例: SQL>alter system set ...另一种方法是手工修改init(sid).ora,再 SQL>create spfile from pfile; SQL>shutdown immediate; SQL>startup另外关于“参数job_queue_interval=10”, 在9i中,我怎么查都没有查到,不知你从哪儿找到的。解决方法: 你按照上面介绍的任意一种方法,修复参数文件后再启动数据库。关于作业的问题,你可以查看视图:user_jobs,all_jobs或dba_jobs, 再查看一下相关作业的资料,认真检查一下你的时间设定。
看看下面的测试,也许能让我们对作业有一些理解: SQL> select * from test; ID NAME T_DATE ---------- ---------- -----------再执行下面的PL/SQL: declare job_id binary_integer; begin dbms_job.submit(job_id,'insert into scott.test values(1,''a'',''abc'');commit;', trunc(sysdate,'MI'), 'trunc(sysdate+1/1440,''MI'')',true); end; --利用作业每分钟对表进行一次插入操作。查询视图user_jobs说明作业已经成功提交,并可以执行:SQL> select job,last_sec,next_sec from user_jobs; JOB LAST_SEC NEXT_SEC ---------- ---------------- ---------------- 52 13:19:01 13:20:00 SQL> select * from test; ID NAME T_DATE ---------- ---------- -------------------- 1 a abc 1 a abc 1 a abc 1 a abc过一会儿再对user_jobs视图进行一次查询: SQL> select job,last_sec,next_sec from user_jobs; JOB LAST_SEC NEXT_SEC ---------- ---------------- ---------------- 52 13:20:02 13:21:00SQL> select * from test; ID NAME T_DATE ---------- ---------- -------------------- 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc6 rows selected 说明作业正在成功执行。现在查询视图dba_jobs_running, SQL> select count(*),sysdate from dba_jobs_running; COUNT(*) SYSDATE ---------- ------------------------------ 0 2004-9-16 13:22:59 过一会儿再执行一次查询: SQL> select count(*),sysdate from dba_jobs_running; COUNT(*) SYSDATE ---------- ------------------------------ 0 2004-9-16 13:25:10 从Oracle的文档中查知: DBA_JOBS_RUNNING lists all jobs in the database that are currently running. 但不太明白为什么会查不到正在运行的作业。不过我们再查询一次执行Insert作业的表test; SQL> select * from test; ID NAME T_DATE ---------- ---------- -------------------- 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc 1 a abc18 rows selected总结: 1、对即将执行的作业,一定要仔细验证; 2、对作业中执行的语句,要通过其它方式进行编译, 并确定无误后,再在作业中运行; 3、对作业进行测试,看是否能成功运行,例: SQL>exec dbms_job.run(50) --50是作业号,通过 --SQL>select job from user_jobs; --能得到,这里不仅可知作业是否可以编译,而且可 --以查看作业运行后的结果; 3、想知道作业是否正在执行,可以通过两种方式了解: 一种方式:查看user_jobs视图,通过时间列的变化 判断;二种方式:查看语句的执行结果,例如前面 直接查询表test,可知表中的记录正在增加; 4、作业失败的可能:编译通不过;编译通过但其中的执 行语句有错误。但都能通过以上检测方法得到验证。
what: begin delete from zlinc.useronline where extract(minute from systimestamp - modifydate) >= 9; commit; end; interval: sysdate + 1/(144)
以SYS用户登陆,执行: 1、select * from v$version; 2、show parameter job 把结果贴出来。
alter system set job_queue_processes=10 scope=spfile;
to:aweihz 结果如下 SQL> select * from v$version 2 /BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production PL/SQL Release 9.2.0.1.0 - Production CORE 9.2.0.1.0 Production TNS for 32-bit Windows: Version 9.2.0.1.0 - Production NLSRTL Version 9.2.0.1.0 - ProductionSQL> show parameter jobNAME TYPE VALUE ------------------------------------ ----------- -------- job_queue_processes integer 10to:zgh2003 代码就这么多呀,一个执行的语句,一个间隔的时间,别的代码没有呀。我是使用PL/SQL developer 5.1.4的,用图形工具生成,不是用命令语句生成的,所以只需要这两个部分的语句。
给你一段代码,供参考: 创建存储过程del_table: create or replace procedure del_table is begin delete from scott.test where rownum<11; commit; end;创建作业每分钟调用一次存储过程del_talbe代码: declare job_id binary_integer; begin dbms_job.submit(job_id,'del_table;', trunc(sysdate,'MI'), 'trunc(sysdate+1/1440,''MI'')',true); end;
SQL>alter system set job_queue_interval=10
SQL>alter system set job_queue_processes=10 scope=spfile;
这种情况只有一种原因,那就是初始化参数文件spfile(sid).ora被破坏
或添加了无效的参数。解决办法:
c:/>sqlplus /nolog
SQL>Conn sys/password as sysdba
SQL>startup pfile='.../oracle/ora92/database/init(sid).ora'
--利用pfile参数文件init(sid).ora启动数据库
SQL>create spfile from pfile; --创建新的spfile参数文件
SQL>shutdown immediate; --重新启动数据库
SQL>startup
兄台功力深厚,能不能告知是什么原因?
启动数据库肯定失败啦!!!spfile(sid).ora是一个二进制文件,不允许手工修改。
要想修改参数,必须在startup数据库以后,使用alter system或
alter session命令,例:
SQL>alter system set ...另一种方法是手工修改init(sid).ora,再
SQL>create spfile from pfile;
SQL>shutdown immediate;
SQL>startup另外关于“参数job_queue_interval=10”,
在9i中,我怎么查都没有查到,不知你从哪儿找到的。解决方法:
你按照上面介绍的任意一种方法,修复参数文件后再启动数据库。关于作业的问题,你可以查看视图:user_jobs,all_jobs或dba_jobs,
再查看一下相关作业的资料,认真检查一下你的时间设定。
我也看了很多的资料还是找不到原因,真是郁闷啊
SQL> select * from test; ID NAME T_DATE
---------- ---------- -----------再执行下面的PL/SQL:
declare
job_id binary_integer;
begin
dbms_job.submit(job_id,'insert into scott.test
values(1,''a'',''abc'');commit;',
trunc(sysdate,'MI'),
'trunc(sysdate+1/1440,''MI'')',true);
end;
--利用作业每分钟对表进行一次插入操作。查询视图user_jobs说明作业已经成功提交,并可以执行:SQL> select job,last_sec,next_sec from user_jobs; JOB LAST_SEC NEXT_SEC
---------- ---------------- ----------------
52 13:19:01 13:20:00
SQL> select * from test; ID NAME T_DATE
---------- ---------- --------------------
1 a abc
1 a abc
1 a abc
1 a abc过一会儿再对user_jobs视图进行一次查询:
SQL> select job,last_sec,next_sec from user_jobs; JOB LAST_SEC NEXT_SEC
---------- ---------------- ----------------
52 13:20:02 13:21:00SQL> select * from test; ID NAME T_DATE
---------- ---------- --------------------
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc6 rows selected
说明作业正在成功执行。现在查询视图dba_jobs_running,
SQL> select count(*),sysdate from dba_jobs_running; COUNT(*) SYSDATE
---------- ------------------------------
0 2004-9-16 13:22:59
过一会儿再执行一次查询:
SQL> select count(*),sysdate from dba_jobs_running; COUNT(*) SYSDATE
---------- ------------------------------
0 2004-9-16 13:25:10
从Oracle的文档中查知:
DBA_JOBS_RUNNING lists all jobs in the database that are currently running.
但不太明白为什么会查不到正在运行的作业。不过我们再查询一次执行Insert作业的表test;
SQL> select * from test; ID NAME T_DATE
---------- ---------- --------------------
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc
1 a abc18 rows selected总结:
1、对即将执行的作业,一定要仔细验证;
2、对作业中执行的语句,要通过其它方式进行编译,
并确定无误后,再在作业中运行;
3、对作业进行测试,看是否能成功运行,例:
SQL>exec dbms_job.run(50) --50是作业号,通过
--SQL>select job from user_jobs;
--能得到,这里不仅可知作业是否可以编译,而且可
--以查看作业运行后的结果;
3、想知道作业是否正在执行,可以通过两种方式了解:
一种方式:查看user_jobs视图,通过时间列的变化
判断;二种方式:查看语句的执行结果,例如前面
直接查询表test,可知表中的记录正在增加;
4、作业失败的可能:编译通不过;编译通过但其中的执
行语句有错误。但都能通过以上检测方法得到验证。
一种方式:查看user_jobs视图,通过时间列的变化
----我看到一直以我设置的时间间隔值在变化
二种方式:查看语句的执行结果
----结果没有任何改变,每隔10分钟去查询,一直都是老样子没有执行语句 另谢谢兄台,这个问题我也觉得很怪,不知道问题出在那里
begin
delete from zlinc.useronline where extract(minute from systimestamp - modifydate) >= 9;
commit;
end;
interval:
sysdate + 1/(144)
1、select * from v$version;
2、show parameter job
把结果贴出来。
SQL> select * from v$version
2 /BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - ProductionSQL> show parameter jobNAME TYPE VALUE
------------------------------------ ----------- --------
job_queue_processes integer 10to:zgh2003
代码就这么多呀,一个执行的语句,一个间隔的时间,别的代码没有呀。我是使用PL/SQL developer 5.1.4的,用图形工具生成,不是用命令语句生成的,所以只需要这两个部分的语句。
创建存储过程del_table:
create or replace procedure del_table
is
begin
delete from scott.test where rownum<11;
commit;
end;创建作业每分钟调用一次存储过程del_talbe代码:
declare
job_id binary_integer;
begin
dbms_job.submit(job_id,'del_table;',
trunc(sysdate,'MI'),
'trunc(sysdate+1/1440,''MI'')',true);
end;