prog:plsql_debug
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
prog:plsql_debug [2016/02/23 21:14] – [Break Point kann nicht gesetzt werden, da Code nicht vorliegt, anonyme Prozedur] gpipperr | prog:plsql_debug [2016/02/23 22:38] (aktuell) – [Netz Probleme] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====PL/SQL Programme im Oracle SQL Developer 4.1 debuggen==== | ||
+ | |||
+ | **Getestet mit v4.1 gegen 11g R2 / 12c R1** | ||
+ | |||
+ | Auch in PL/SQL lässt sich recht einfach ein Programm wie in anderen Programmiersprache debuggen. | ||
+ | |||
+ | Da PL/SQL aber im Core der Datenbank läuft muss eine Remote Verbindung auf die Datenbank aufgebaut werden um diese Vorgang dort zu überwachen. | ||
+ | |||
+ | Dazu ist es aber unerlässlich, | ||
+ | |||
+ | |||
+ | Der Remote Debugger wird auf dem Client gestartet und die Datenbank verbindet sich zu dieser IP Adresse und diesen Port! | ||
+ | |||
+ | ===Vorbereitung DB === | ||
+ | |||
+ | Der Datenbank User benötigt zum Debuggen entsprechende Rechte und ab 12c muss mit einer ACL auch der Netzzugriff erlaubt sein. | ||
+ | |||
+ | |||
+ | **Rechte zum Debuggen** auf dem User, die PL/SQL debuggen will, vergeben: | ||
+ | <code sql> | ||
+ | sqlplus / as sysdba | ||
+ | |||
+ | grant DEBUG CONNECT SESSION to gpi; | ||
+ | grant DEBUG ANY PROCEDURE to gpi; | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | **Oracle 12c** Netzwerk ACL setzen! | ||
+ | <fc # | ||
+ | <code sql> | ||
+ | ORA-24247: Netzwerkzugriff von Access Control-Liste (ACL) abgelehnt | ||
+ | ORA-06512: in " | ||
+ | ORA-06512: in Zeile 1 | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | BEGIN | ||
+ | | ||
+ | ( | ||
+ | host => ' | ||
+ | | ||
+ | | ||
+ | ace => xs$ace_type(privilege_list => xs$name_list(' | ||
+ | | ||
+ | | ||
+ | ); | ||
+ | END; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===Aufruf des Debuggers=== | ||
+ | |||
+ | PL/SQL Code über das Debugging übersetzen, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | Eine Break Point über den linken Rand des Editors setzen | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | " | ||
+ | |||
+ | {{: | ||
+ | ====Verknüpfen des Debuggers mit einer SQL*Plus Session==== | ||
+ | |||
+ | Soll der PL/SQL Block nicht im SQL*Developer gestartet werden, sonder über SQL*Plus (zum Beispiel direkt auf dem Server) wird die laufenden Session aus SQL*Plus direkt an den Debugger in SQL Developer " | ||
+ | |||
+ | |||
+ | In SQL*Plus PL/SQL Block zum Debuggen übersetzen, | ||
+ | <code sql> | ||
+ | |||
+ | alter session set PLSCOPE_SETTINGS=' | ||
+ | alter session set PLSQL_OPTIMIZE_LEVEL=1; | ||
+ | alter session set PLSQL_DEBUG=true; | ||
+ | |||
+ | alter function validateUser compile; | ||
+ | |||
+ | |||
+ | -- testen ob es geklappt hat | ||
+ | -- auf plsql_debug muss TRUE sein | ||
+ | |||
+ | select | ||
+ | owner | ||
+ | , name | ||
+ | , type | ||
+ | , plsql_optimize_level | ||
+ | , plsql_code_type | ||
+ | , plsql_debug | ||
+ | , plsql_warnings | ||
+ | , plsql_ccflags | ||
+ | , plscope_settings | ||
+ | from dba_plsql_object_settings | ||
+ | where NAME like upper(' | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Im SQL*Developer Debugger über die Connection Baum auf der rechten Seite auf einen Port wie 4444 starten: | ||
+ | |||
+ | * Rechte MausTaste auf dem Connection Object, Aufruf über " | ||
+ | * {{: | ||
+ | * Port und IP Adresse auf dem der Debugger " | ||
+ | * {{: | ||
+ | |||
+ | |||
+ | In SQL Plus die Debug Connection zu dem obigen Listener aktivieren: | ||
+ | <code sql> | ||
+ | |||
+ | -- Debug Session auf einen Port starten, z.B. 4444 | ||
+ | |||
+ | begin | ||
+ | DBMS_DEBUG_JDWP.CONNECT_TCP( ' | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | Der Datenbank Core verbindet sich mit dem Debugger Listener auf dem Client PC: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | |||
+ | Dann die Funktion in SQL*Plus normal starten, in PL/SQL Developer hält die Verarbeitung am zuvor gesetzten Break Point im geöffneten Code in PL/SQL Developer an. | ||
+ | |||
+ | === Break Point kann nicht gesetzt werden, da Code nicht vorliegt, anonyme Prozedur === | ||
+ | |||
+ | Kann keine Break Point in der Routine gesetzt, werden, zum Beispiel eine anonyme PL/SQL Routine, zuvor eine Dummy Funktion im PL/SQL Developer definieren und in dieser eine " | ||
+ | |||
+ | |||
+ | Dummy Funktion in SQL Developer anlegen und dort zum Debuggen übersetzen, | ||
+ | |||
+ | procedurein SQL*Plus anlegen | ||
+ | <code sql> | ||
+ | create or replace procedure my_debugSession | ||
+ | is | ||
+ | begin | ||
+ | null; | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Pl/SQL Developer starten und dort die Procedure öffnen. | ||
+ | |||
+ | Für Debug übersetzen und eine Break Point setzen. | ||
+ | |||
+ | |||
+ | Wie im oberen Beispiel eine SQL*Plus Debug Session initialisieren und die Procedure my_debugSession gleich zu beginn des anoynmen PL/SQL Blockes aufrufen. | ||
+ | |||
+ | <code sql> | ||
+ | -- anleitung wie oben | ||
+ | |||
+ | declare | ||
+ | v_var number; | ||
+ | begin | ||
+ | -- für den Halte Punkt die dummy Procedure aufrufen | ||
+ | | ||
+ | -- Hier startet der eigentliche Code | ||
+ | -- | ||
+ | end; | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Der Debugger im SQL Developer springt damit an, und des kann über den gesamten Code gesteppt werden! | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Probleme ==== | ||
+ | |||
+ | ===Netz Probleme=== | ||
+ | |||
+ | Die Netzwerk Verbindung muss von Server zum Client für den Port, der in der Log Ausgaben, angezeigt wird auch durch die Firewall funktionieren! | ||
+ | |||
+ | |||
+ | Beispiel Ausgabe: | ||
+ | |||
+ | < | ||
+ | PL/SQL wird ausgeführt: | ||
+ | </ | ||
+ | |||
+ | Dann muss auch nun ein Zugriff auf den Port 5555 und die IP Adresse srvdbgpi01 erlaubt sein! | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | === DAs dbms_debug_jdwp Package=== | ||
+ | |||
+ | |||
+ | SID und Serial ohne Rechte auf die V$Session auswerten: | ||
+ | <code sql> | ||
+ | select dbms_debug_jdwp.current_session_id sid | ||
+ | , dbms_debug_jdwp.current_session_serial serial | ||
+ | from dual | ||
+ | / | ||
+ | </ | ||
+ | geht aber auch über sys_context(' | ||
+ | |||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | |||
+ | Oracle: | ||
+ | * http:// | ||
+ | |||
+ | Im Netz: | ||
+ | |||
+ | * https:// | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * http:// | ||
+ | * http:// | ||
prog/plsql_debug.txt · Zuletzt geändert: 2016/02/23 22:38 von gpipperr