[PL/SQL] Globale Variablen

Hallo zusammen,
ich habe eine Package-Spezifikation mit globalen Variablen erstellt und möchte mir diese anzeigen lassen. Diese Anzeige soll aber nicht über den Source-Code erfolgen.

Die Parameter einer Procedure oder Function bekomme ich ja mt DESCRIBE - für Variablen klappt das aber nicht…

Vielen Dank dafür.

Gruß Janus

Lösung : keine
Eigentlich ist es ja peinlich auf sein eigenes Posting zu antworten. Dennoch hilft es vielleicht auch anderen:

Es gibt keinen ‚einfachen Befehl‘ sondern nur einen Workaround ueber die user_source. Mit einer entsprechenden View kann man sich die globalen Variablen dann anschauen.

Gruss Janus

PS: Kennt ihr eigentlich das PL/SQL-Forum unter http://www.revealnet.com/Pipelines/PLSQL/index.htm --> Pipetalk ? Lohnt sich.

Es gibt keinen ‚einfachen Befehl‘ sondern nur einen Workaround
ueber die user_source. Mit einer entsprechenden View kann man
sich die globalen Variablen dann anschauen.

So weit war ich auch schon, allerdings bin ich dann bei einer PL/SQL-Prozedur gelandet. Wenn das mit einem View auch geht, dann bitte mir den zukommen zu lassen… (bzw. hier zu posten, vielleicht interessiert es ja sonst auch noch jemanden).

Danke,
TheBeast

So weit war ich auch schon, allerdings bin ich dann bei einer
PL/SQL-Prozedur gelandet. Wenn das mit einem View auch geht,
dann bitte mir den zukommen zu lassen… (bzw. hier zu posten,
vielleicht interessiert es ja sonst auch noch jemanden).

Die View kann nur dann funktionieren, wenn alle globalen Variablen in einer Spezifikation sind:

CREATE OR REPLACE VIEW my_global_vars
AS
SELECT text AS my_global_vars
FROM user_source
WHERE line != 1
AND line != (SELECT max(line)
FROM user_source
WHERE name = ‚GLOBAL_VARS‘)
AND name = ‚GLOBAL_VARS‘
/

Ansonsten kann man sich nur mit einer Prozedur weiterhelfen :

**CREATE OR REPLACE PROCEDURE view_glob_vars
(p_name IN VARCHAR2)
IS

CURSOR cur1 IS SELECT line, text
FROM user_source
WHERE name = p_name;
v_count NUMBER(4);

BEGIN

SELECT max(line)
INTO v_count
FROM user_source
WHERE name = p_name;

DBMS_OUTPUT.PUT_LINE(CHR(10)||‚my_global_vars :‘||CHR(10));

FOR rec1 IN cur1
LOOP
IF rec1.line NOT IN (1, v_count) THEN
DBMS_OUTPUT.PUT_LINE(rec1.text);
END IF;
END LOOP;

END;
/**

Gruß Janus

PS: Meine Skripte habe ich dir via Mail geschickt.

Ansonsten kann man sich nur mit einer Prozedur weiterhelfen :

**CREATE OR REPLACE PROCEDURE view_glob_vars
(p_name IN VARCHAR2)
IS

CURSOR cur1 IS SELECT line, text
FROM user_source
WHERE name = p_name;
v_count NUMBER(4);

BEGIN

SELECT max(line)
INTO v_count
FROM user_source
WHERE name = p_name;

DBMS_OUTPUT.PUT_LINE(CHR(10)||‚my_global_vars :‘||CHR(10));

FOR rec1 IN cur1
LOOP
IF rec1.line NOT IN (1, v_count) THEN
DBMS_OUTPUT.PUT_LINE(rec1.text);
END IF;
END LOOP;

END;
/**

Gruß Janus

PS: Meine Skripte habe ich dir via Mail geschickt.

Hi Janus,

Danke für das Mail. So ganz das, was ich mir erwartet hätte ist das noch nicht. Das heißt, eigentlich habe ich mir gar nix zu erwarten, schließlich hattest ja Du Hilfe gesucht :wink: Jedenfalls dachte ich mir, es sollten NUR die globalen Variablen eines Packages ausgegeben werden, beide obenstehenden Lösungen nehmen aber keine Rücksicht, ob es sich um FUNCTION/PROCEDURE-Definitionen, Tapdefinitionen oder gar Kommentare handelt.

Weil ich das aber bei mir einbauen wollte, bin ich immer noch am tüfteln. Das blöde daran ist nämlich, daß man im Prinzip einen PL/SQL-Parser schreiben muß, wenn man wirklich nur Objekte eines bestimmten Typs ausgeben will. Ich dachte mir auch schon, man müßte das irgendwie aus den Oracle internen Tabellen herauszaubern können, aber da habe ich noch nix zielführendes gefunden.

Gruß,
TheBeast