Запланированное задание Oracle не выполняется
Я использую 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 ответов
Предполагая, что это скрипт для SQL*Plus, есть два / misssing, так что он вообще ничего не делает:
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;
/
Я полагаю, что это еще одна работа, а не твоя.
Попробуйте вставить явный блок 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
Я также попробовал решение Ника Пирпойнта, но у меня это не сработало. Похоже, что-то не так с УДАЧЕЙ, потому что я попробовал то же самое на другой машине с Oracle 9i, и это не удалось!!!
Спасибо всем за ваши ответы.
С уважением
Вы не делаете никакой выборки данных здесь, но я думаю, что некоторые ON UPDATE
активировать ARCH_TEMP
стол может Проверь это.
Я бы использовал триггер SERVERERROR (как описано здесь), чтобы попытаться перехватить оператор, который не выполняется. Но сначала вы можете проверить журнал предупреждений. Если рекурсивный SQL вызывает ошибки, возможно, проблема в словаре данных.