PL/SQL-Code mit APEX generieren (DEV... · Fehler-Logging • nicht explizit ... • Der Klassiker...

30
PL/SQL-Code mit APEX generieren WHEN OTHERS Beratung | Programmierung | Coaching rund um Oracle Application Express [email protected] http://when-others.com Andreas Wismann DOAG-Webinar am 13.06.2013

Transcript of PL/SQL-Code mit APEX generieren (DEV... · Fehler-Logging • nicht explizit ... • Der Klassiker...

PL/SQL-Code mit APEX generieren

WHEN OTHERS Beratung | Programmierung | Coaching rund um Oracle Application Express [email protected] http://when-others.com

Andreas Wismann

DOAG-Webinar am 13.06.2013

Einstieg • PL/SQL-Programme oft strukturell identisch • Zeitintensive Codierung • Fehlerquellen • automatisieren?

Die Zutaten • EXCEPTION-Handling • Autonome Transaktion • Object Types • Pipelined Functions • APEX Collections • plsqlDoc (JavaDoc)

Was soll generiert werden?

Der Quellcode enthält… • Einen Kommentarblock • Eine Methoden-Initialisierung

mit Parameter-Logging • Einen NULL-Befehl, damit der Code kompiliert • Einen Exception-Handler, der im Fehlerfall alle

geloggten Parameter in eine Tabelle schreibt • Saubere Formatierung und Einrückung

Exkurs: Der Editor • PL/SQL Developer • http://allroundautomations.com • noFormat-Kommentare schützen den

Quelltext vor Beautifier-Umformatierung • plsqlDoc-Plugin

erzeugt die technische Dokumentation • Beispiel…

plsqlDoc /** * Nimmt die vollständige Signatur einer Methode entgegen und liefert eine * typisierte Methodendefinition zurück, wenn ein eingegebene Text syntaktisch * korrekt war und erfolgreich analysiert werden konnte. * * @param i_method_signature IN VARCHAR2 * * @return Im Erfolgsfall eine Variable vom Typ t_method, die alle Bestandteile * der Methode enthält, bei Misserfolg NULL. * @usage Wird von der APEX-Applikation aufgerufen. * * @date 2012-10-16 */

Parameter-Logging • PL/SQL bietet keinen generischen Ansatz zum

Auslesen der Werte von Function/Procedure-Parametern

• Durch Code-Generierung wird dieses Feature bequem "simuliert"

• Im Fehlerfall können die Inhalte aller Parameter in eine Tabelle geschrieben werden

Parameter-Logging c_paramlist CONSTANT LOGS.LOGS_PARAMLIST%TYPE := 'i_param_1=' || i_param_1 || chr(10) || 'i_param_2=' || to_date(i_param_2, 'DD.MM.YYYY HH24:MI:SS');

i_param_1=Beitragsrückerstattung i_param_2=13.06.2013 00:00:00

Parameter-Logging • to_char existiert nicht für alle Datentypen

(z.B. BOOLEAN) • daher für diverse Datentypen passenden Code

generieren lassen CASE i_boolean WHEN TRUE then 'TRUE' WHEN FALSE then 'FALSE' ELSE 'NULL' END

to_char(i_date, 'YYYY.MM.DD HH24:MI:SS')

Parameter-Logging • Für Objekttypen: eigene to_string-Methode schreiben. • Namenskonvention ist Hinweis auf Objekttyp:

versende_rechnung (i_rechnung T_RECHNUNG)

… v_parametername := CASE WHEN v_method_parameter.p_type = 'OBJECT' THEN v_method_parameter.p_name || '.to_string()' ELSE v_method_parameter.p_name -- "normale" Datentypen END;

Exception Handling • Entweder überhaupt keins • oder: konsistent und überall

Fachliche Fehler abfangen (z.B. WHEN NO_DATA_FOUND THEN RETURN NULL;) Technische Fehler hochgeben (z.B. WHEN OTHERS THEN RAISE;)

EXCEPTION HANDLING EXCEPTION WHEN OTHERS THEN -- den Fehlerzustand aufzeichnen: logger.error( i_unit => c_unit ,i_paramlist => c_paramlist ,i_line => $$PLSQL_LINE ,i_action => v_action ,i_comment => NULL -- ergänzen ); -- und das Problem nach "oben" weiterreichen: RAISE;

Dies wird im Fehlerfall notiert

Autonome Transaktion PROCEDURE log (…) IS PRAGMA AUTONOMOUS TRANSACTION; BEGIN INSERT INTO LOGS (…) VALUES (…); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END;

Autonome Transaktion • Zum Sichern der aufgezeichnteten Parameter • Muss entweder

"committen" oder "rollbacken" • unabhängig vom sonstigen Programmablauf • Debugging • Tracing ("Mitschreiben") während der Entwicklung zu

beliebigen Zwecken

Package "LOGGER" • logger.trace Loglevel 0 • logger.info Loglevel 1 • logger.debug Loglevel 2 • logger.warning Loglevel 3 • logger.error Loglevel 4 • logger.fatal Loglevel 5

Fehler-Logging • nicht explizit codieren, was implizit verfügbar ist!

dbms_utility.format_error_backtrace()

dbms_utility.format_call_stack()

SQLCODE

SQLERRM

v('APP_SESSION') v('APP_ID') v('APP_PAGE_ID') v('REQUEST')

$$PLSQL_UNIT • Name der aktuell ausgeführten Standalone-

Funktion bzw. -Prozedur oder

• Name der aktuell ausgeführten Package (dann jedoch nicht inklusive des Methoden-Namens!)

dbms_output.put_line($$PLSQL_UNIT);

$$PLSQL_LINE • Zeilennummer des aktuell ausgeführten Befehls

im Quelltext • auch in anonymen Blöcken definiert

dbms_output.put_line($$PLSQL_LINE);

APEX Collection • speichert alle im Formular eingegebenen

Funktions- bzw. Prozedurparameter • beliebig viele Zeilen ("Member") • benannt: "METHOD_PARAMETERS"

create_collection_from_query

select * from apex_collections …

Tabular Forms-Benutzereingaben C001 C002 C003 C049 C050

N001 … N005

D001 … D005

BLOB001

CLOB001

XMLTYPE001

Literaturempfehlungen

• Kurzübersicht • Konzepte, Befehle und

Parameter • anschauliche Beispiele • 7,40 €

Literaturempfehlungen

• Der Klassiker von Steven Feuerstein & Bill Prybil

• > 1200 Seiten • auch auf deutsch • 43,95 €

Lesetipp

Expert Oracle Application Express • behandelt APEX 4 • ausführlicher Teil zu Tabular Forms • gute Einführung zu APEX-Collections • Charts, Dynamic Actions, Plugins u.v.m.

WHEN OTHERS Beratung | Programmierung | Coaching rund um Oracle Application Express

Andreas Wismann

[email protected] http://when-others.com