2009-11-20 17 views
2

Je souhaite créer un travail qui supprimerait un objet de base de données à une date donnée. Le travail a bien été créé mais la procédure n'est pas exécutée. Essayé d'exécuter la procédure seule et cela fonctionne.Comment exécuter une procédure avec la procédure DBMS_SCHEDULER.CREATE_JOB

Voici le code pour le créer travail

v_jobnam := v_objnam; 
       v_jobnam := DBMS_SCHEDULER.generate_job_name (v_jobnam); 

v_startdate := to_timestamp(v_startdate); 
    select sysdate + (v_delhrs/1440) 
     into v_startdate 
     from dual; 

DBMS_SCHEDULER.CREATE_JOB(job_name => v_jobnam, job_type => 'PLSQL_BLOCK', JOB_ACTION => 'BEGIN DROP_OBJ1(' || v_objnam|| ', ' || v_objtyp || ', '|| v_schema || ',' || v_objid ||'); END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=secondly; bysecond=0', end_date => NULL, enabled => TRUE, comments => 'Calls PLSQL once'); 

où v_delhrs est un nombre. Voici le code de la procédure:

PROCEDURE DROP_OBJ1 
    (
     p_objnam  IN CHAR, 
     p_objtyp  IN CHAR, 
     p_copyto  IN ALL_OBJECTS.OWNER%TYPE, 
     p_objid  IN NUMBER 
    ) 
    IS 

     v_objnam  VARCHAR2 (30); 
     v_objtyp  VARCHAR2 (30); 
     v_copyto  VARCHAR2 (30); 
     v_objid  NUMBER (3); 


    BEGIN 

      v_objnam := UPPER (p_objnam); 
      v_objtyp := UPPER (p_objtyp); 
      v_copyto := UPPER (p_copyto); 
      v_objid := p_objid; 
      --v_copyby := UPPER (p_copyby); 

      EXECUTE IMMEDIATE (' DROP ' 
           || v_objtyp 
           || ' ' 
           || v_copyto 
           || '.' 
           || v_objnam 
           ); 

      EXECUTE IMMEDIATE (' DELETE FROM COPY_OBJ_DET WHERE OBJ_ID = ' 
           || v_objid 
           ); 


     COMMIT; 

    END; 

Je sais que un problème très mineur. Merci d'avance gourous.

À la votre!

Répondre

6

Il me semble que vous avez manqué quelques guillemets dans l'appel d'installation DBMS_JOBS.

Essayez ceci:

DBMS_SCHEDULER.CREATE_JOB(job_name  => v_jobnam, 
          job_type  => 'PLSQL_BLOCK', 
          JOB_ACTION  => 'BEGIN DROP_OBJ1(''' || v_objnam 
              || ''', ''' || v_objtyp || ''', ''' 
              || v_schema || ''',' || v_objid 
              || '); END;', 
          start_date  => SYSTIMESTAMP, 
          repeat_interval => 'freq=secondly; bysecond=0', 
          end_date  => NULL, 
          enabled   => TRUE, 
          comments  => 'Calls PLSQL once'); 

Si ce n'est pas la solution que je configure votre code sur une base de données et d'essayer moi-même.

+0

Un grand merci, cela fonctionne. Entre les deux, habitez-vous réellement sur un bateau à voile? Merci, vous avez fait ma journée. À la votre! – Tunde

+0

Oui - J'ai vendu ma société de logiciels il y a 2 ans. Nous avons été de haut en bas le coût de l'Est et aux Bahamas. Je vis avec ma belle femme et 2 merveilleux enfants sur un voilier de 50 pieds. –

+0

Vous pouvez consulter la vue user_scheduler_jobs (ou all_scheduler_jobs) pour vérifier que les données de votre travail sont conformes à vos attentes –