14. Juli 2008

Mehr Informationen über den PL/SQL-Code: PL/Scope

English title: Deep Dive into your PL/SQL code: PL/Scope

  • Wo hatte ich die Variable V_AMOUNT verwendet?
  • Wo in meinem PL/SQL-Code sind die Aufrufe auf MYPROC?
  • Wo waren die SQL-Abfragen auf die Tabelle EMP?
All diese Fragen können in Oracle11g auch ohne Find & Replace beantwortet werden; denn es gibt PL/Scope. PL/Scope sammelt, sobald es aktiviert ist, Informationen über die Verwendung von "Identifiers" - ob sie verwendet werden und wenn ja, wo sie verwendet werden. Wichtig ist allerdings, dass man es vor dem Kompilieren oder Re-Kompilieren des PL/SQL Codes wie folgt aktiviert ...
  • Where in the PL/SQL code is the declaration of V_DATE?
  • Where in the PL/SQL code are the calls to MYPROC?
  • Where are the SQL queries on EMP?
Those and other questions are most frequently answered by performing the development environments' find & replace functions. But Oracle11g has a feature for this: PL/Scope. PL/Scope collects, when activated, information about the usage of identifiers in the PL/SQL code and if yes, where the identifiers were used. But before this information is provided PL/Scope must be activated.
alter session set PLSCOPE_SETTINGS='IDENTIFIERS:ALL';
Wie nehmen als Beispiel mal die Table Function aus dem Blog Posting vom März. Zuerst also PL/Scope aktivieren, dann rekompilieren wir die Funktion um die Informationen zu sammeln ...
We'll take the Table Function of a previous blog posting as example. Firstly we activate PL/Scope, then we perform a recompile of the procedure in order to collect the identifier usage information ...
alter function tilgungsplan compile;
... und dann stehen die Informationen in den Dictionary Views *_IDENTIFIERS zur Verfügung. So könnte man nun abfragen, wo die Variable v_datum genutzt wird ...
... and then the information is provided in the dictionary views *_IDENTIFIERS. Now we can check where the variable v_datum was used ...
SQL> select line, col, type, usage from user_identifiers where name='V_DATUM' order by line, col;

      LINE        COL TYPE               USAGE
---------- ---------- ------------------ -----------
        10          3 VARIABLE           DECLARATION
        17          3 VARIABLE           ASSIGNMENT
        20         27 VARIABLE           REFERENCE
        35          5 VARIABLE           ASSIGNMENT
        35         16 VARIABLE           REFERENCE
        36         29 VARIABLE           REFERENCE

6 Zeilen ausgewählt.
Man sieht also: In Zeile 10 wird die Variable deklariert, in Zeile 17 bekommt sie einen Wert zugewiesen, in Zeile 20wird sie verwendet und so weiter und so fort ...
As we can see: It's declaration is in line 10, in line 17 a value gets assigned to it, in line 20 it is being used and so forth ...
Oder man könnte abfragen, wo das Paket UTL_HTTP überall verwendet wird (klar, das geht auch mit USER_DEPENDENCIES, aber PL/Scope zeigt auch, wo im Code das Paket verwendet wurde) ...
The next query is about the usage of UTL_HTTP (it's clear that USER_DEPENDENCIES also provides some information, but PL/Scope provides fine-grained information - where exactly was this package used) ...
SQL> select object_name, line, col, type, usage from user_identifiers where name='UTL_HTTP' order by line,col

OBJECT_NAME           LINE        COL TYPE               USAGE
--------------- ---------- ---------- ------------------ -----------
MY_PROCEDURE             3          9 SYNONYM            REFERENCE
MY_PROCEDURE             4          9 SYNONYM            REFERENCE
MY_PROCEDURE            37         10 SYNONYM            REFERENCE
MY_PROCEDURE            41          3 SYNONYM            REFERENCE
MY_PROCEDURE            42          3 SYNONYM            REFERENCE
MY_PROCEDURE            44          3 SYNONYM            REFERENCE
MY_PROCEDURE            45         11 SYNONYM            REFERENCE
MY_PROCEDURE            48          5 SYNONYM            REFERENCE
MY_PROCEDURE            51          4 SYNONYM            REFERENCE
Nun ist es eines, solche Informationen in SQL*Plus zu selektieren - besser ist es, wenn man PL/Scope direkt in der Entwicklungsumgebung nutzen kann - und im neuesten SQL Developer 1.5.1 (Build 5440) ist es auch drin. Wenn Ihr dort auf Ansicht und dann auf Extended Search klickt, dann könnt Ihr PL/Scope nutzen - Probiert es aus ...
Now it's not very convinient so query this information in SQL*Plus - it would be much better when the development environment would directly support this. And the newest SQL Developer 1.5.1 (build 5440) supports it actually. Just click on View and then on Extended Search and the PL/Scope functionality gets available on the right hand side.



Mehr Info zum Thema findet sich im Handbuch Advanced Application Developer's Guide (Chapter 8). Darin findet Ihr auch eine Aufstellung, in welchen Zusammenhängen Ihr die Verwendung von Identifiers abfragen könnt.
More information is available in the Advanced Application Developer's Guide (Chapter 8). This also contains an overview on the identifier types which are queryable in the *_IDENTIFIER views.

Kommentare:

Torsten Kleiber hat gesagt…

Hallo!

Irgenwie kriege ich das im SQL Deverloper 4.0.3 / 4.1 EA nicht ans laufen?

Viele Grüße

Carsten Czarski hat gesagt…

Hallo Torsten,

das muss ich mir mal ansehen; konkret ausprobiert habe ich es noch nicht. Was genau klappt denn nicht ?

Schick' mir doch einfach eine Mail zu.

Beste Grüße

Carsten

Beliebte Postings