Inhaltsverzeichnis
Oracle Apex 20.2 - Mit den APEX Automations Feature Code im Hintergrund bei Bedarf starten
Mit dem APEX Automations Feature (Declarative asynchronous processes ) läßt sich gut Logik im Hinterrund der Applikation bei Bedarf ausführen.
Typische Business Cases:
Workflows anstarten wenn bestimmte Daten in der Datenbank vorliegen
- Wie: Sachbearbeiter A hat Vorgang bearbeitet und abgeschlossen, Kunde B erhält automatisch eine Mail das der Vorgang bearbeitet wurde
- Wie: Bei Fehlern im Log Admin per Mail benachrichtigen
Regelmäßig im Hintergrund etwas starten
- Wie: Logs aufräumen
Vorteil:
- Voll in der APEX Welt integriert
- Es werden kein Rechte für das Anlegen von Jobs benötigt
- Nach einen Deployment sind die Aufgaben/Jobs einfach “da” !
- Jobs müssen nicht jedesmal umständlich neu angelegt / angepasst werden
Anlegen
Ablauf
Die Automation
Voraussetzung
Das Schema in der die APP läuft muss das Rechte „create Job“ besitzen!
# als SYS GRANT CREATE job TO GPI;
Anlegen über die APEX Oberfläche
Anlegen in der Applikation unter “Shared Components” / ” Application Logic - Automations“
Über die Oberfläche definieren:
In der Query kann auf die letzte Ausführung der Automation referenziert werden:
SELECT * FROM {TABLE} WHERE created_at > apex_automation.get_last_run;
Im den Aktionen der Automation kann per „:“ Notation auf die Spalten in der Automation Check Query zugegriffen werden, über die API können Log Einträge erstellt und die Ausführung der Aktion gesteuert werden.
Beispiel Action:
BEGIN apex_automation.log_info( p_message => 'Found '||:ENAME ); IF :ENAME = 'Gunther' THEN apex_automation.skip_current_row( p_log_message => 'Gunther is found' ); apex_automation.log_warn( p_message => 'Gunther is found' ); END IF; IF :ENAME IS NULL THEN apex_automation.exit(p_log_message => 'No Member Name found' ); END IF; END;
Über die API Aufrufen
Referenziert wird der Automation Task über seine Static ID.
Siehe dazu ⇒ https://docs.oracle.com/en/database/oracle/application-express/20.2/aeapi/APEX_AUTOMATION.html
Zum Beispiel über Button mit PL/SQL aufrufen:
apex_automation.execute( p_static_id => 'new-emp-message' );
Abfragen
Metadaten abfragen:
Was wurde angelegt:
- APEX_APPL_AUTOMATION_ACTIONS
- APEX_APPL_AUTOMATIONS
Monitoring
- APEX_AUTOMATION_LOG
- APEX_AUTOMATION_MSG_LOG
Intern
Was wird erzeugt? – Wer ruft das dann auf?
- Pro Automation wird kein Job angelegt, sondern ein zentraler APEX Job unter dem APEX Schema Eigentümer fragt per Default alle 2 Minuten die definierten Automations ab.
- Dieser Job ruf wwv_flow_automation.EXECUTE_DUE_AUTOMATIONS auf und prüft Tabelle “WWV_FLOW_AUTOMATIONS” auf notwendige Aufrufe.
- Falls der Job laufen soll, wird ein einmaliger Job über den Oracle Scheduler angelegt mit der Methode “wwv_flow_automation.EXECUTE_AUTOMATION_ACTIONS” .
- Diese starte den eigentliche Task Code im richtigen Scope der jeweiligen APEX Applikation über “WWV_FLOW_PLUGIN.EXECUTE_PROCESS“.