
| dbms_scheduler Oracle Komponenten zur Planung und Steuerung von datenbankabhängigen Aktionen, bestehend aus einer PL/SQLSchnittstelle, zugehörigen Hintergrundprozessen und einer Reihe von Data Dictionary Views. |
| Resource Manager Tool zur Verwaltung von Ressourcen, wie CPU-Zeit, maximale Anzahl Sessions, Parallelitätsgrad etc. für Benutzergruppen in einem bestimmten Zeitraum. |
| Resource Consumer Group Eine Gruppe von Oracle Benutzern mit gleicher Anforderung an die benötigten Ressourcen. |
| Ressourcenplan Beschreibt die periodenabhängige Zuordnung von Ressourcen zu einer Resource Consumer Group. |
| EXTPROC Eigenständiger Prozess auf Betriebssystemebene, der Library Dateien dynamisch einbindet, die entsprechenden Funktionen aufruft und deren Rückgabewerte an Oracle zurückgibt. |
| Callouts Aufrufe von externen Funktionen, die in einer anderen Programmiersprache implementiert sind, als die aufrufende Funktion. |
Weiterführende Links
Referenzen
|
||||||||||||||||||||||||||||||
| Abb. 1: Objekttypen im Scheduler-Umfeld. | ||||||||||||||||||||||||||||||
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'Jobtest1'
,schedule_name => 'Schedule1'
,program_name => 'Program1'
,job_class => 'ORDIX_JOB_CLASS'
);
SYS.DBMS_SCHEDULER.ENABLE
( NAME => 'DH.Jobtest');
END;
/
| ||||||||||||||||||||||||||||||
| Abb. 2: Beispiel für eine Job-Definition. | ||||||||||||||||||||||||||||||
SYS.DBMS_SCHEDULER.CREATE_JOB_CLASS
(
job_class_name => 'ORDIX_JOB_CLASS'
,resource_consumer_group => 'LOW_GROUP'
,service => NULL
,logging_level => SYS.DBMS_SCHEDULER.LOGGING_FULL
,log_history => 30
,comments => NULL
);
| ||||||||||||||||||||||||||||||
| Abb. 3: Beispiel für eine Job-Class-Definition. | ||||||||||||||||||||||||||||||
CREATE OR REPLACE FUNCTION W2KWRAPP (
lpCmdLine IN VARCHAR2,
uCmdShow IN PLS_INTEGER := 1 )
RETURN PLS_INTEGER
IS
EXTERNAL LIBRARY kernel32 NAME "WinExec"
LANGUAGE C CALLING STANDARD PASCAL
PARAMETERS (
lpCmdLine STRING,
uCmdShow LONG,
RETURN LONG
);
/
| ||||||||||||||||||||||||||||||
| Abb. 4: Beispiel für die Definition einer Wrapper Funktion mit Zugriff auf ein dynamisches Library-Objekt. | ||||||||||||||||||||||||||||||
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ANY")
)
)
| ||||||||||||||||||||||||||||||
| Abb. 5: Beispiel für eine Listener.ora Konfiguration. | ||||||||||||||||||||||||||||||
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
| ||||||||||||||||||||||||||||||
| Abb. 6: Beispiel für eine Tnsnames.ora Konfiguration. | ||||||||||||||||||||||||||||||
SET SERVEROUTPUT ON
DECLARE
v_ret NUMBER;
BEGIN
v_ret := W2KWRAPP ('cmd /q /c mkdir c:\temp\test');
DBMS_OUTPUT.PUT_LINE ('1st command: v_ret=' || v_ret);
END; / | ||||||||||||||||||||||||||||||
| Abb. 7: Beispiel für den Aufruf einer Wrapper Funktion mit Zugriff auf ein dynamisches Library-Objekt. |
Der Objekttyp Job und sieben weitere Objekttypen sind im Zusammenhang mit der Job-Verwaltung und dem Paket DBMS_SCHEDULER in Oracle 10g eingeführt worden. Ein Job kombiniert die Metadaten eines Programms mit einer Zeitdefinition. Sowohl das Datum der Ausführung als auch die damit verbundene Aktion kann direkt im Job oder auch indirekt über ein Schedule bzw. Programm erfolgen.
Neben den Basiskomponenten des Pakets DBMS_SCHEDULER existieren weitere, optionale Komponenten. Den Schedule erweitert ein Zeitfenster (Window) um eine Laufzeit und eine optionale Verknüpfung mit einem Ressourcenplan. Mit einem Window Group lassen sich mehrere Zeitfenster zusammenfassen.
Jobs können in Klassen gruppiert werden. Jobklassen sind die Verbindung zum Resource Manager der Datenbank. Mittels der Konsumentengruppen können Ressourcenzusagen für die jeweiligen Jobklassen gegeben werden. Oracle erstellt automatisch eine Jobklasse mit dem Namen AUTO_TASKS_JOB_CLASS und eine Konsumentengruppe mit dem Namen AUTO_TASKS_CONSUMER_GROUP.
Die automatisch angelegten Komponenten werden von Oracle zur Aktualisierung der Tabellenstatistiken genutzt. Aus einer Abfolge von Programmen lassen sich zudem Ablaufketten (Chain) definieren. Ein Job kann eine solche Abfolge von Programmen anstoßen.
Alle zuvor genannten Scheduler-Komponenten sind mit einem gleichnamigen Objekttyp verbunden. In Abbildung 1 sind sämtliche Objekttypen, die im Zusammenhang mit der Jobverwaltung stehen, aufgeführt.
Eine ausführliche Betrachtung des Themas DBMS_SCHEDULER finden Sie in der ORDIX News 1/2005 [1].
Eine Job-Definition besteht, wie das Beispiel in der Abbildung 2 zeigt, mindestens aus einem Job, der Ausführungszeit, hier eine Referenz auf ein Schedule („Schedule1“), und einer Referenz auf ein auszuführendes Programm („Program1“). Ein Beispiel für die Definition eines Job Clas Objektes ist in Abbildung 3 aufgelistet.
Folgende Scheduler-Komponenten erzeugen keine Objekte im Sinne von DBA_OBJECTS:
Bei der Scheduler-Komponente mit dem Namen AGENT_REGISTRATION_PASSWORD handelt es sich um ein Objekt im Sinne von DBA_OBJECTS, dessen Objekttyp aber nicht namentlich in der View DBA_OBJECTS definiert ist, sondern als Objekttyp UNDEFINED aufgeführt wird. Es handelt sich hierbei um das Passwort zur Anmeldung des Agenten zur Remote-Jobausführung, welcher mit der Version 11g eingeführt wird.
Eine Library ist eine Sammlung von Funktionen, die über eine Schnittstelle der PL/SQL-Engine zur Verfügung gestellt wird. Libraries können statisch oder dynamisch eingebunden werden. Eine statische Library liegt in Form von C-Byte Code in der Datenbank vor. Ein statisches Library-Objekt wird wie folgt definiert:
CREATE OR REPLACE LIBRARY ORDIX_LIB TRUSTED AS STATIC
Eine dynamische Library ist ein mit einer Datei verknüpftes Schemaobjekt. Über ein dynamisches Library-Objekt wird aus PL/SQL heraus auf externe Funktionen zugegriffen, die in einer externen Library-Datei implementiert sind. Seit Oracle 8 stehen diese Aufrufe (Callouts) aus PL/SQL heraus zur Verfügung.
Eine typische Anwendung ist der Zugriff auf eine betriebssystemnahe Funktion. Diese liegt in der Form von Shared-Library-Dateien vor. Das folgende Beispiel erstellt ein Library-Objekt auf die Betriebssystem-Shared-Library-Datei „Kernel32.dll“ unter Windows, die sich im System32-Verzeichnis befindet.
CREATE OR REPLACE LIBRARY kernel32 as 'C:\windows\system32\kernel32.dll';
Der Status VALID des Objektes in der View User_libraries besagt nicht unbedingt, dass die angegebene Datei im lokalen Filesystem tatsächlich existiert. Ein Library-Objekt kann natürlich auch auf einen Remote-Rechner verweisen. Sollte sich die Library-Datei nicht im angegebenen Pfad befinden, kommt es erst bei der Ausführung der Funktion zu einem Fehler: ORA-06520: PL/SQL: Fehler beim Laden der externen Bibliothek.
Um eine externe Funktion aufrufen zu können, muss die aufrufende PL/SQL-Prozedur (siehe Abbildung 4) wissen, in welcher Datei sich diese Funktion befindet. Dazu wird in der Alias Library nach dem Dateinamen gesucht und anschließend via SQL-NET der Listener kontaktiert. Dieser startet den Oracle Agent EXTPROC-Prozess. Hierfür wird ein Eintrag, wie in den Abbildungen 5 und 6 gezeigt, in der Listener.ora und der Tnsnames.ora benötigt.
Von nun an kommunizieren der EXTPROCProzess und die PL/SQL-Engine direkt miteinander. Der Prozess EXTPROC besteht für die Dauer der aufrufenden Session. Nach Beendigung der Session wird auch EXTPROC beendet.
Für jede Session, die externe Funktionen verwendet, startet ein eigener EXTPROC-Prozess. Die PL/SQL-Engine übergibt den Namen der Shared Library-Datei an den EXTPROC-Prozess mit Hilfe des Library-Objektes und der PL/SQL Wrapper Function. Dieser bringt die Shared-Library-Funktion zur Ausführung und übergibt das Resultat der PL/SQL-Engine. Die erfolgreiche Ausführung der externen Funktion kann über den Rückgabewert (siehe Abbildung 7) kontrolliert werden.
In einer der nächsten ORDIX News setzen wir die Artikelreihe dann wieder alphabetisch fort.
Dirk Hansmeier (info@ordix.de).