我正在使用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
。
答案 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的机器上尝试了同样的事情而且失败了!!!
谢谢大家的回复。
此致