2010-09-08 15 views
0

J'utilise Oracle 10g et en utilisant un script suivant pour créer le travailOracle tâche planifiée échoue

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; 

Le travail exécute jamais automatiquement (si elle fonctionne manuellement) avec l'erreur suivante dans 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 

Je suis incapable de lier l'erreur ORA-01422 avec n'importe lequel de mon code. Je ne fais aucun fetch ici.

+0

Je ne pense pas que vous nous montrez le bon code (ou message d'erreur). Le message d'erreur fait référence à une ligne 8 qui n'est apparemment pas dans la procédure que vous avez publiée. Et * cette * instruction de mise à jour ne pouvait pas lancer le message d'erreur * this *. –

Répondre

0

Vous ne faites pas de recherche de données ici, mais je suppose que certains déclencheur ON UPDATE sur ARCH_TEMP pourrait le faire. Vérifie ça.

+0

Pas de déclencheur du tout – Atti

+0

Il est possible qu'ammoQ ait raison, alors, effectuez un 'select * from user_jobs où job = 26', et voyez lequel échoue réellement. Il devrait avoir le statut «cassé». –

+0

Il y a trois autres travaux mais aucun d'entre eux n'est cassé ou même échoué une fois. – Atti

1

En supposant qu'il est un script pour SQL * Plus, il y a deux/misssing, il ne fait rien du tout:

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; 
/

Je suppose que c'est un autre emploi ne, pas le vôtre.

+0

Même si ce travail est supprimé, je continue d'obtenir erreur suivante dans le journal – Atti

+0

[J'ai appuyé sur Entrée pour une nouvelle ligne et le commentaire est posté :)] ORA-00604: erreur s'est produite au niveau SQL récursif 1 ORA-01422: exact fetch renvoie plus que le nombre de lignes demandé ORA-06512: à la ligne 8 – Atti

+0

Eh bien, si vous le pouvez (pas une machine de production), désactivez les autres tâches et voyez ce qui se passe. Toujours obtenir les erreurs dans le journal? Non? Réactiver le premier travail, attendez. Répétez jusqu'à ce que l'erreur réapparaisse. Oui? Connectez-vous en tant qu'administrateur de base de données et vérifiez ALL_JOBS pour les travaux exécutés dans un autre schéma. –

0

J'utiliserais un déclencheur SERVERERROR (comme décrit here) pour essayer d'intercepter l'instruction qui échoue. Mais d'abord, vous pouvez vérifier le journal des alertes. Si le code SQL récursif est erroné, il peut y avoir un problème dans le dictionnaire de données.

+0

Je ne vous ai pas parlé de "SERVERERROR". J'ai désactivé tous les autres travaux mais le mien échoue – Atti

+0

SERVERERROR est un type de déclencheur qui peut capturer des informations supplémentaires lorsqu'une erreur est renvoyée. Vous obtenez une erreur TOO_MANY_ROWS et vous devez identifier le SQL et les tables impliquées. Une trace (DBMS_MONITOR) devrait également faire le travail. –

0

Essayez de placer un bloc PL/SQL explicite comme paramètre WHAT.

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

Voici mon cas de test, ce qui semble bien fonctionner:

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

J'ai essayé solution par Nick Pierpoint aussi bien, mais ça n'a pas marché pour moi Il ressemble à quelque chose ne va pas avec CHANCE parce que J'ai essayé la même chose sur une autre machine ayant Oracle 9i et elle a échoué !!!

Merci à tous pour vos réponses.

Cordialement

+0

Alors vous avez suivi mon exemple et ça a échoué? –

+0

Oui, cependant, j'ai utilisé le même script pour créer deux tâches sur un service différent (9i) avec deux tables et procédures différentes et les deux fonctionnaient bien. Mon collègue a créé 1 travail sur 11g avec DBA et il a échoué et l'autre travail sur le même service a été créé en utilisant USER qui fonctionne correctement. J'ai essayé à la fois avec et sans DBA sur 10g et les deux ont échoué. – Atti