2016-09-22 2 views
0

Ich versuche einen dbms_scheduler-Job innerhalb einer gespeicherten Prozedur zu erstellen, nachdem eine Logik ausgeführt wurde. Mein Prozedurcode ist wie folgt. Das Problem besteht darin, dass der Scheduler-Code nicht ausgeführt wird und die Prozedur zum Zeitpunkt des Erstellens des Jobs keine Ausnahme auslöst. Der Job erstellt eine Feinabstimmung, wenn er unabhängig als anonymer Block ausgeführt wird. Ist das der richtige Weg, um das zu erreichen, was ich versuche?dbms_scheduler erstellt keinen Job, wenn er in einer gespeicherten Prozedur erstellt wird

create or replace procedure PROC_INS_TEST AS 
    v_success varchar2(255) := '1'; 
    v_job_name varchar2(255); 
    BEGIN 

     SELECT 'TEST' || dbms_scheduler.generate_job_name into v_job_name 
     FROM DUAL; 

     INSERT INTO T_TEMP_STAGING--log table 
     (job_id, process_name) VALUES (1, 'TEST'); 
     Commit; 
      v_success := '1'; 

     BEGIN 
      sys.dbms_scheduler.create_job (
      job_name  => v_job_name, 
      job_type  => 'PLSQL_BLOCK', 
      job_action  => 'BEGIN PROC_TEST_SCHEDULER; END;', 
      --start_date  => sysdate, 
      --repeat_interval => 'freq=hourly; byminute=0; bysecond=0;', 
      enabled   => TRUE); 

     END; 
     dbms_output.put_line(v_success); 


    EXCEPTION 
     WHEN OTHERS THEN   
      v_success = '0'; 
      ROLLBACK; 
      RETURN; 
    END PROC_INS_TEST; 
+2

Wie wissen Sie es nicht eine Ausnahme wirft, wenn Sie irgendetwas sind fangen sie mit werfen 'wenn andere' Sehen Sie das 'dbms_output'-Ergebnis, das nur 1 sein kann, oder erscheint das nicht - was bedeutet, dass Sie in den Ausnahmebehandler gegangen sind? Wie auch immer, ist Ihre Erlaubnis, einen Job zu erstellen, der durch eine Rolle oder direkt für Ihren Benutzer gewährt wird? –

+0

Ups, ich gab gerade die Ausnahme nicht aus. Ich sehe, dass es nicht genügend Privilegfrage ist. Es wurde durch Rollen gewährt. Es funktioniert einwandfrei, nachdem dem Benutzer entsprechende Berechtigungen erteilt wurden. Danke Alex Poole. – DG3

+0

Es ist fast immer besser, die Ausnahme einfach weitergeben zu lassen, anstatt "wenn andere" zu verwenden und die Ausnahme selbst anzuzeigen. für den Anfang hat der Aufrufer möglicherweise nicht "dbms_output" aktiviert; und der PL/SQL-Block, von dem dieser aufgerufen wird, kann nicht groß werden, wenn er tatsächlich erfolgreich war. –

Antwort

1

Es scheint, Sie separaten Ausnahmeblock nicht mit einberechnet, die Ausnahmen von create_job zu fangen:

begin 
     sys.dbms_scheduler.create_job (
     job_name  => v_job_name, 
     job_type  => 'PLSQL_BLOCK', 
     job_action  => 'BEGIN PROC_TEST_SCHEDULER; END;', 
     enabled   => TRUE); 
    exception when other than 
     dbms_output.put_line('Job ' || job_name || ' cannot be created! ' || SQLERRM); 
     raise; 
    end; 
Verwandte Themen