Запланированное задание Oracle не выполняется - PullRequest
0 голосов
/ 08 сентября 2010

Я использую 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 ]

1 голос
/ 08 сентября 2010

Предполагая, что это скрипт для 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;
/

Я полагаю, что это другая работа, не ваша.

0 голосов
/ 14 сентября 2010

Я тоже попробовал решение Ника Пирпойнта, но у меня оно не сработало Похоже, что-то не так с LUCK, потому что я попробовал то же самое на другой машине с Oracle 9i, и это не удалось !!!

Спасибо всем за ваши ответы.

Привет

0 голосов
/ 09 сентября 2010

Попробуйте вставить явный блок 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
0 голосов
/ 09 сентября 2010

Я бы использовал триггер SERVERERROR (как описано здесь ), чтобы попытаться отловить оператор, который не выполняется. Но сначала вы можете проверить журнал предупреждений. Если рекурсивный SQL вызывает ошибки, возможно, проблема в словаре данных.

0 голосов
/ 08 сентября 2010

Вы не производите выборку данных здесь, но я предполагаю, что некоторые ON UPDATE триггеры могут ARCH_TEMP таблицы.Проверьте это.

...