fehlervermeidung und debugging in apex - when...
TRANSCRIPT
![Page 1: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/1.jpg)
Saubere Arbeit !
Fehlervermeidung und Debugging in APEX
WHEN OTHERS Beratung | Programmierung | Coaching rund um Oracle Application Express [email protected] http://when-others.com
Andreas Wismann
![Page 2: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/2.jpg)
Einstieg
• Es gibt wenig "APEX Design Patterns" • Einheitliche Entwurfsmuster für die Praxis • wartbare APEX-Anwendungen • pragmatischer Ansatz
![Page 3: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/3.jpg)
Credo
• Never Add Functionality Early • Know Your Tools • Test Your Code • RTFM
![Page 4: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/4.jpg)
![Page 5: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/5.jpg)
HTML & Co. beherrschen
• HTML • CSS • jQuery • jQuery mobile
![Page 6: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/6.jpg)
SQL und PL/SQL auffrischen
• Pivot • Model Clause • Pipelined Functions • RESULT_CACHE • XML DB • …
![Page 7: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/7.jpg)
Zwei-Schichten-Architektur
DB
APEX
![Page 8: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/8.jpg)
Ordnung schaffen!
• Validierungen • Prozesse • Hidden Items • Berechnungen • Templates • Conditions • Selects • … (puh!)
![Page 9: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/9.jpg)
Seiten "sperren"
• Vor jeder Bearbeitung auf das Schloss klicken • Schutz ist nicht 100% wasserdicht… • Admin kann Sperren aufheben
![Page 10: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/10.jpg)
Drei ///
• Markieren Sie Baustellen mit /// • ist in jedem Zeichensatz lesbar • verträgt sich mit SQL*Plus • wird von jeder Volltextsuche gefunden
v_info := '/// mit Fachbereich klären';
![Page 11: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/11.jpg)
Testbaren Code schreiben
• keine Mega-SQL-Statements in APEX • Views, Trigger verwenden • Pipelined Table Functions • „Kurzer Prozess“ • V('…') erschwert (automatisches) Testen • V('…') bedeutet Vermeiden
![Page 12: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/12.jpg)
V('…') vermeiden
FUNCTION get_rollen RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = v('APP_USER'); END get_rollen;
![Page 13: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/13.jpg)
V('…') vermeiden
FUNCTION get_rollen RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; v_app_user varchar2 := v('APP_USER'); BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = v_app_user; END get_rollen;
![Page 14: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/14.jpg)
V('…') vermeiden
FUNCTION get_rollen (i_app_user IN VARCHAR2) RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = i_app_user; END get_rollen;
![Page 15: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/15.jpg)
PL/SQL gehört in die Datenbank
• in APEX Performance-Nachteile • im APEX-Fenster kein Debugging möglich • kein Komfort durch Code Completion • Invalider Code kann überleben
warum?
![Page 16: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/16.jpg)
Ein Package pro Seite
Page 1000
Page 1100
Page 1200
APEX
P1000
P1100
P1200
Package
![Page 17: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/17.jpg)
Einheitliche Namen
• Button: SPEICHERN • Request: SPEICHERN • Prozess: SPEICHERN • Branch: SPEICHERN
P100.SPEICHERN ( i_datum => :P100_DATUM );
![Page 18: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/18.jpg)
Verteilte Geschäftslogik • Validierung in APEX :P2_VERTRAGSBEGINN >= trunc(SYSDATE) and extract (DAY FROM to_date(:P2_VERTRAGSBEGINN, 'DD.MM.YYYY')) = 1
"Der Vertragsbeginn kann nur an einem Monatsersten und nicht rückwirkend beginnen."
• Fehlermeldung
• Gleich mehrere Probleme…
![Page 19: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/19.jpg)
![Page 20: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/20.jpg)
Zentrale Geschäftslogik • APEX-Validierung ruft Datenbankfunktion auf
![Page 21: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/21.jpg)
Zentrale Geschäftslogik • APEX-Validierung ruft Datenbankfunktion auf
![Page 22: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/22.jpg)
Zentrale Geschäftslogik • APEX-Validierung ruft Datenbankfunktion auf FUNCTION check_vertragsbeginn (i_datum in date) RETURN VARCHAR2 IS BEGIN IF i_datum < trunc(SYSDATE) OR extract(DAY FROM i_datum) != 1 THEN RETURN 'Der Vertrag kann nur an einem Monatsersten' || ' und nicht rückwirkend beginnen'; END IF; RETURN NULL; -- fehlerfrei END check_vertragsbeginn;
![Page 23: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/23.jpg)
Page 0
• PL/SQL-Region namens TEST_OUTPUT • Einfaches Platzhalter-Template verwenden
<div id="#REGION_STATIC_ID#"> #BODY# </div>
• Der Region eine Static ID mitgeben • Build Option TEST
![Page 24: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/24.jpg)
Hidden Items
• Page 0: HTML-Region namens HIDDEN_ITEMS für sämtliche Hidden Items der Anwendung
• Wieder das Platzhalter-Template verwenden • Werte „hervorzaubern“ mit jQuery
![Page 25: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/25.jpg)
Hidden-Items-Region auf Page 0
$(function() { var table = '<table>'; // Region Static ID ist "hiddenItemsPage0" $('#hiddenItemsPage0 input[id]').each(function() { table += '<tr><td>' + $(this).attr('id') + ':</td><td>' + $(this).val() +'</td></tr>'; }); table += '</table>'; // Region Static ID ist "testOutput" $('#testOutput').prepend($(table)); });
![Page 26: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/26.jpg)
Demo: Hidden Items
![Page 27: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/27.jpg)
Subscription ("Abonnieren")
• Templates (u.a.) zentral verwalten • Mit wenigen Klicks sämtliche Anwendungen
im Workspace aktualisieren • Ebenso: LOVs, Shortcuts, Plugins, Navigation
Bar Entries, …
![Page 28: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/28.jpg)
Demo: Subscription ///
![Page 29: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/29.jpg)
Conditions zentralisieren
• Formular hat mehrere logische Bereiche? • Regions-Template namens PARENT_REGION
<div class="parent_region"> #BODY# </div>
• Bereiche als Parent-Regionen definieren, alle abhängigen Regionen unterordnen
• Formulieren Sie die Conditions nur ein einziges Mal auf den Parent-Regionen
![Page 30: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/30.jpg)
Shortcuts verwenden
• Nicht-Wiederverwendbarkeit von Items und Regionen abmildern
• PL/SQL-Shortcuts sehen &VARIABLEN. IF &P0_BEDINGUNG. THEN &P0_PROZEDURNAME. ; END IF;
![Page 31: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/31.jpg)
Build Options verwenden
• Alles, was zum Entwickeln und Testen dient, erhält die Build Option TEST ("Include")
• Später wird TEST wieder auf "Exclude" umgestellt
![Page 32: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/32.jpg)
Plug-ins verwenden
• Funktionalität und Code werden gekapselt • Entwickler brauchen nur "auszuwählen" • Neue Versionen einfach verteilbar
![Page 33: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/33.jpg)
![Page 34: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/34.jpg)
Session State
Komisch, jetzt funktioniert's
plötzlich!
![Page 35: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/35.jpg)
Session State
• In-Memory Session State vs. Persisted Session State
• Merkwürdig? Ausloggen und Einloggen!
![Page 36: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/36.jpg)
Demo: Tabs
![Page 37: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/37.jpg)
Items können nicht rechnen
:P1_A := 3000; :P1_B := 5; :P1_X := :P1_A + :P1_B; -- 3005 IF :P1_A > :P1_B THEN -- wird niemals ausgeführt!
![Page 38: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/38.jpg)
Demo: Rechnen
![Page 39: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/39.jpg)
Items sind VARCHAR's!
:P100_A := to_number('1000'); :P100_B := to_number('5'); IF :P100_A > :P100_B THEN -- nie im Leben!
![Page 40: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/40.jpg)
Items sind VARCHAR's!
:P100_A := 1000; :P100_B := 5; IF to_number(:P100_A) > to_number(:P100_B) THEN -- dann klappt's auch mit der Number!
![Page 41: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/41.jpg)
Gnädige Browser
• Es existieren semantische JavaScript-Fehler • id="xyz" mehrfach vergeben • Zirkelbezüge in Dynamic Actions • "submit" sowohl im Objekt als auch in Dynamic Action
• Skripte funktionieren zunächst • Irgendwann sind zu viele "Spielregeln" verletzt
![Page 42: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/42.jpg)
APEX_DEBUG_MESSAGE
• Einfaches Logging-Werkzeug • Schreibt in das Debug-Log der Anwendung • selbst, wenn Debugging ausgeschaltet ist
APEX_DEBUG_MESSAGE.LOG_MESSAGE ( p_message => '/// Code dringend prüfen in ' || $$PLSQL_UNIT || ', Zeile: ' || $$PLSQL_LINE ,p_enabled => TRUE ,p_level => 1 );
![Page 43: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/43.jpg)
DBMS_APPLICATION_INFO
• Sagt Ihrem Admin, welches "Programm" läuft • Erleichtert Identifizierung und Beenden
hängender Sessions DBMS_APPLICATION_INFO.set_module ( module_name => 'meine_procedure' ,action_name => 'Plausi-Prüfung' );
![Page 44: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/44.jpg)
DBMS_APPLICATION_INFO
PROCEDURE log_module ( i_module_name in VARCHAR2 ) IS BEGIN DBMS_APPLICATION_INFO.set_module ( module_name => i_module_name ); APEX_DEBUG.ENTER ( p_routine_name => i_module_name ); END;
![Page 45: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/45.jpg)
DBMS_APPLICATION_INFO PROCEDURE log_module ( i_module_name in VARCHAR2 ) IS BEGIN NULL; $IF $$DEBUG_MODE $THEN
DBMS_APPLICATION_INFO.set_module ( module_name => i_module_name ); APEX_DEBUG.ENTER ( p_routine_name => i_module_name );
$END END;
ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE' REUSE SETTINGS;
![Page 46: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/46.jpg)
Code-Generatoren verwenden PROCEDURE meine_prozedur ( i_tag IN NATURAL ,i_monat IN NATURAL ,i_jahr IN NATURAL ) IS BEGIN …
APEX_DEBUG.ENTER ( p_routine_name => 'meine_prozedur' ,p_name01 => 'i_tag' ,p_value01 => i_tag ,p_name02 => 'i_monat' ,p_value02 => i_monat ,p_name03 => 'i_jahr' ,p_value03 => i_jahr );
![Page 47: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/47.jpg)
Leuchtspur-Munition
• "Warum macht er das denn nicht???" BEGIN :P1_X := UMSATZ ( p_monat => 1 ); END;
![Page 48: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/48.jpg)
Leuchtspur-Munition
• Lassen Sie es krachen! BEGIN :P1_X := UMSATZ ( p_monat => 1/0 ); END;
![Page 49: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/49.jpg)
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;)
![Page 50: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/50.jpg)
Application Errors
• Home > Administration > Monitor Activity > Application Errors
![Page 51: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/51.jpg)
Eigene Error-Function
![Page 52: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/52.jpg)
Eigene Error-Function
![Page 53: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/53.jpg)
APEX Advisor
• Findet :TIPPEFHLER • Erkennt invalide Codeblöcke
return VALIDIERUNG.check_vertragsbeginn ( i_datum => :P2_VERTRASGBEGINN )
![Page 54: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/54.jpg)
APEX Advisor
![Page 55: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/55.jpg)
APEX Advisor
![Page 56: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/56.jpg)
APEX-Views
SELECT * FROM APEX_APPLICATION_PAGE_ITEMS
![Page 57: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/57.jpg)
APEX-Views
![Page 58: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/58.jpg)
Funktioniert trotzdem nicht???
• wegwerfen und neu bauen ist oft keine schlechte Idee…
![Page 59: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/59.jpg)
Team Development
• Angaben zur Anwendung und Seite nicht vergessen
![Page 60: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/60.jpg)
Anwender-Feedback
• Feedback-Seite in die Anwendung einbauen
![Page 61: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/61.jpg)
Literaturempfehlung
• Expert Oracle Application Express John Scott, Dietmar Aust et. al. (2011) ISBN 978-1430235125
• zu Version 4.0 • diverse Fallbeispiele
![Page 62: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/62.jpg)
Literaturempfehlung
• Pro Oracle SQL Karen Morton (2010) ISBN 978-1430232285
• zu Version 11g • kein SQL-Einsteigerbuch
![Page 63: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/63.jpg)
Literaturempfehlung
• Der Pragmatische Programmierer Andrew Hurt, David Thomas (2003) ISBN 978-3446223097
• ausführliche Betrachtung verbreiteter Fehler
• professionelle Entwurfsmuster
• trotzdem kurzweilig
![Page 64: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/64.jpg)
Viel Spaß beim Schrauben…
![Page 65: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/65.jpg)
WHEN OTHERS Beratung | Programmierung | Coaching rund um Oracle Application Express
Andreas Wismann
[email protected] http://when-others.com
![Page 66: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/66.jpg)
Wenn noch Zeit ist…
• Auf NULL als Returnwert verzichten
• Browser exakt spezifizieren
![Page 67: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/67.jpg)
Einheitliche Bedienung
1 2 3 4 5 6 7 8 9
1 4 7 2 5 8 3 6 9
![Page 68: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/68.jpg)
ID einmalig vergeben
// falsch: <input id="datumseingabe" name="datum1" type="text" value=""> <input id="datumseingabe" name="datum2" type="text" value=""> <input id="datumseingabe" name="datum3" type="text" value=""> <input id="datumseingabe" name="datum4" type="text" value=""> <input id="datumseingabe" name="datum5" type="text" value="">
// richtig: <input class="datumseingabe" name="datum1" type="text" value=""> <input class="datumseingabe" name="datum2" type="text" value=""> <input class="datumseingabe" name="datum3" type="text" value=""> <input class="datumseingabe" name="datum4" type="text" value=""> <input class="datumseingabe" name="datum5" type="text" value="">
![Page 69: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/69.jpg)
HTML-Tags schließen
<!-- falsch --> <table> <tr> <td>Zelle 1 <td>Zelle 2 </table>
<!-- richtig --> <table> <tr> <td>Zelle 1 </td> <td>Zelle 2 </td> </tr> </table>
![Page 70: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/70.jpg)
Pipelined Function FUNCTION komplexer_report (i_info IN VARCHAR2) RETURN report_table_t PIPELINED IS v_report report_t; BEGIN for c in ( -- kompliziertes Select select feld1 , case when feld2 = 'XYZ' then '123' else NULL END as feld2 from … -- noch komplizierter! where … -- höchst kompliziert !!! ) loop v_report.feld1 = geschaeftslogik1 ( c.feld1, i_info ); v_report.feld2 = geschaeftslogik2 ( c.feld2, i_info ); PIPE ROW; end loop; RETURN; END;
![Page 71: Fehlervermeidung und Debugging in APEX - when …when-others.com/download/doag/2012/debugging/APEX-Debugging... · ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE](https://reader034.vdocuments.site/reader034/viewer/2022052420/5a7920a37f8b9a07628c8dbd/html5/thumbnails/71.jpg)
Pipelined Function
select * from table ( komplexer_report (:P500_XY) )
• Return-Typen (für Row und Table) müssen in der Datenbank registriert sein