PL/SQL-Code mit APEX generieren (DEV... · Fehler-Logging • nicht explizit ... • Der Klassiker...
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)
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;
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"
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