Oracle 19c DBMS_JOB Package

01.
August
2019
Veröffentlicht von: Christan Klose

Schon vor längerer Zeit wurde von Oracle angekündigt, dass das Package DBMS_JOB deprecated wird. Was sollten Sie wissen bzw. beachten, wenn Sie ihre Datenbank auf 19c migrieren wollen?

Vorwort

Mit Oracle 10g wurde das Package DBMS_SCHEDULER eingeführt. Bis dato gab es die DBMS Jobs. Ab Oracle 12 Release 2 wurde das Package DBMS_JOB auf deprecated gesetzt. Bei folgenden Aktionen

  • Upgrade
  • Import
  • DBMS_JOB.submit();

werden in Zusammenhang mit Oracle 19c, DBMS-Jobs zu DBMS-Scheduler Tasks konvertiert.

Ausganssituation auf der Quelldatenbank

Die Abfrage auf USER_JOBS vom Benutzer MQS_LTM liefert folgendes Ergebnis:

    JOB LAST_DATE            NEXT_DATE            BROKEN     WHAT
------- -------------------- -------------------- ---------- ----------------------------------------
     62 21.07.2019 03:00:04  17.07.2019 19:52:40  N          pkg_ltm_collect.p_purge(31);
     64 21.07.2019 04:00:00  18.07.2019 04:00:00  N          pkg_mqs_err.purge_error_log(31);
     63 21.07.2019 04:00:00  18.07.2019 04:00:00  N          pkg_mqs_trace.purge_trace_log(31);
     61 21.07.2019 10:31:02  18.07.2019 03:00:00  N          pkg_ltm_collect.p_collect;


Nach Import auf der Zieldatenbank

Die Abfrage auf USER_JOBS vom Benutzer MQS_LTM liefert folgendes Ergebnis:

    JOB LAST_DATE            NEXT_DATE            BROKEN     WHAT                                    
------- -------------------- -------------------- ---------- ----------------------------------------
     61                      17.07.2019 19:52:40  N          pkg_ltm_collect.p_collect;              
     64                      18.07.2019 04:00:00  N          pkg_mqs_err.purge_error_log(31);        
     63                      18.07.2019 04:00:00  N          pkg_mqs_trace.purge_trace_log(31);      
     62                      18.07.2019 03:00:00  N          pkg_ltm_collect.p_purge(31);


Die Abfrage auf USER_SCHEDULER_JOBS liefert folgendes Ergebnis:

JOB_NAME        JOB_TYPE         JOB_ACTION                          START_DATE          REPEAT_INTERVAL           ENABLED
--------------- ---------------- ----------------------------------- ------------------- ------------------------- --------
DBMS_JOB$_61    PLSQL_BLOCK      pkg_ltm_collect.p_collect;          17.07.2019 19:52:40 SYSDATE+5/1440            TRUE   
DBMS_JOB$_62    PLSQL_BLOCK      pkg_ltm_collect.p_purge(31);        18.07.2019 04:00:00 trunc(sysdate+1)+3/24     TRUE   
DBMS_JOB$_63    PLSQL_BLOCK      pkg_mqs_trace.purge_trace_log(31);  18.07.2019 04:00:00 trunc(sysdate+1)+4/24     TRUE   
DBMS_JOB$_64    PLSQL_BLOCK      pkg_mqs_err.purge_error_log(31);    18.07.2019 04:00:00 trunc(sysdate+1)+4/24     TRUE   

HINWEIS: Die Jobs sind sowohl in der View USER_JOBS und USER_SCHEDULER_JOBS aktiv!

Wird mit DBMS_JOB.submit ein Job unter 19c angelegt, was möglich ist, taucht dieser in beiden Views (USER_JOBS und USER_SCHEDULER_JOBS) auf und ist zweimal aktiv!

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jul 21 12:42:04 2019
Version 19.4.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Sun Jul 21 2019 11:28:35 +02:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.4.0.0.0

SQL>

set serveroutput on
DECLARE
  X NUMBER;
BEGIN
    SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'pkg_ltm_collect.p_collect;'
     ,next_date => to_date('21.07.2019 19:52:40','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'SYSDATE+5/1440'
     ,no_parse  => FALSE
     ,instance  => 1
    );
    SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
  COMMIT;
END;
/
show error
commit;

Job Number is: 106

No errors.

Die View USER_SCHEDULER_JOBS:

JOB_NAME        JOB_ACTION                          ENABLED    START_DATE       
--------------- ----------------------------------- ---------- -----------------
DBMS_JOB$_106   pkg_ltm_collect.p_collect;          TRUE       21.07.19 12:31:29

Die View USER_JOBS:

    JOB LAST_DATE            NEXT_DATE            BROKEN     WHAT                                    
------- -------------------- -------------------- -------------------- ---------- --------------------------
    106 21.07.2019 12:31:29  21.07.2019 12:36:29  N          pkg_ltm_collect.p_collect;  

Das bedeutet, der Job_Name DBMS_JOB$_106 bzw. der Job 106 wird zeitgleich doppelt ausgeführt.


Fazit

Vor der Migration / dem Upgrade auf Oracle 19c empfehlen wir die „alten“ DBMS-Jobs nach DBMS-Scheduler Tasks zu migrieren. Auch sollten die vorhandenen Prozdeuren und/oder Packages auf die Verwendung von DBMS_JOB geprüft werden. Dabei können wir Ihnen gerne behilflich sein.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.