Oracle预定作业失败

时间:2010-09-08 08:56:21

标签: oracle jobs ora-12012 ora-01422

我正在使用Oracle 10g并使用以下脚本来创建作业

CREATE OR REPLACE PROCEDURE archtemp AS
BEGIN
    UPDATE ARCH_TEMP SET ARCH_DATE = SYSDATE; 
    COMMIT;
END archtemp;

VAR jobno NUMBER;
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 'archtemp;', SYSDATE, 'sysdate + 1/1440');
   COMMIT;
END;

作业永远不会自动执行(尽管它是手动运行的)alert_sid.log

中存在以下错误
ORA-12012: error on auto execute of job 26
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 8

我无法将ORA-01422错误与我的任何代码相关联。我这里没有fetch

5 个答案:

答案 0 :(得分:1)

假设这是一个SQL * Plus的脚本,有两个/错误,所以它什么都不做:

CREATE OR REPLACE PROCEDURE archtemp AS
BEGIN
    UPDATE ARCH_TEMP SET ARCH_DATE = SYSDATE; 
    COMMIT;
END archtemp;
/

VAR jobno NUMBER;
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 'archtemp;', SYSDATE, 'sysdate + 1/1440');
   COMMIT;
END;
/

我想这是另一项失败的工作,不是你的。

答案 1 :(得分:0)

您不在此处执行任何数据提取,但我猜ON UPDATE表上的某些ARCH_TEMP触发器可能会。检查一下。

答案 2 :(得分:0)

我使用SERVERERROR触发器(如here所述)来尝试捕获失败的语句。但首先,您可以查看警报日志。如果递归SQL出错,则数据字典中可能存在问题。

答案 3 :(得分:0)

尝试将明确的PL / SQL块作为WHAT参数。

dbms_job.submit(v_jobno, 'begin archtemp; end;', sysdate, 'sysdate+1/1440');

这是我的测试用例,似乎工作正常:

create table arch_temp (
    arch_date date
    );

-- create row to test update
insert into arch_temp (arch_date) values (null);

create or replace procedure archtemp as
begin
    update arch_temp set arch_date = sysdate;
    commit;
end archtemp;
/

-- test everything works in isoloation

begin 
    archtemp; 
end;
/

select * from arch_temp;
-- arch_date = 10:49:34

select * from user_jobs;
-- no rows returned

declare
    v_jobno number;
begin
    dbms_job.submit(v_jobno, 'begin archtemp; end;', sysdate, 'sysdate+1/1440');
    commit;
    dbms_output.put_line('v_jobno: ' || to_char(v_jobno));
end;
/

-- dbms_output...
-- v_jobno: 50520

select * from user_jobs;

-- JOB 50520 returned
-- LAST_DATE = 10:51:11

select * from arch_temp;

-- ARCH_DATE = 10:51:11

答案 4 :(得分:0)

我也尝试过Nick Pierpoint的解决方案,但它对我不起作用 LUCK看起来有点不对劲,因为我在另一台拥有Oracle 9i的机器上尝试了同样的事情而且失败了!!!

谢谢大家的回复。

此致