Oracle
Posts 1-8 of 8
-
Fabian SchafrothThe company name is only visible to registered members.Private / Public erkennen?
Guten Tag
Gibt es eine Oracle Dictionary View über welche sich erkennen lässt, ob eine in einem Package Body definierte Funktion oder Prozedur im Package (Header) auch definiert ist - also, ob die Funktion/Prozedur private oder public definiert ist?
Besten Dank für die Hilfe
Fabian Schafroth
- 15 Nov 2011, 09:06 am
-
Jörg SobottkaThe company name is only visible to registered members.Re: Private / Public erkennen?
Hallo,
ist ja recht einfach:
select * from dba_source d where d.type ='PACKAGE' and name ='???';
Wenn der Package Header Text gewrapped ist sehen Sie in der DBA-Source allerdings nichts, dann müssten Sie über
select * from dba_procedures d where d.object_type='PACKAGE' and object_name ='?????' gehen.
Viele Grüsse aus Basel
Jörg Sobottka
Delta Energy Solution AG
- ausgezeichnet mit dem "Industry Partner of the Year 2011" von Oracle (Schweiz) GmbH
This post was modified on 15 Nov 2011 at 10:27 am.- 15 Nov 2011, 10:27 am
-
Fabian SchafrothThe company name is only visible to registered members.Re^2: Private / Public erkennen?
Hallo Herr Sobottka
Besten Dank für die Antwort.
Die DBA_SOURCE ist nicht meine erste Wahl, da ich diese Information in einem automatisierten Prozess benötige und ich nicht unbedingt noch den Sourcecode Zeile für Zeile analysieren möchte.
Ich bin auch bei den DBA_PROCEDURES angelangt, was eigentlich schon nicht schlecht wäre, aber diese View gibt mir nur die öffentlichen Prozeduren/Funktionen aus. Jene, welche nur im Package Body definiert sind, sind nicht ersichtlich. Ich hoffe aber noch auf eine solche View à la DBA_PROCEDURES, welche mir diese Prozesse auch noch offenbart.
Freundliche Grüsse
Fabian Schafroth
- 15 Nov 2011, 11:08 am
-
Jörg SobottkaThe company name is only visible to registered members.Re^3: Private / Public erkennen?
Hallo Herr Schafroth,
Fabian Schafroth schrieb:
Ich bin auch bei den DBA_PROCEDURES angelangt, was eigentlich schon nicht schlecht wäre, aber diese View gibt mir nur die öffentlichen Prozeduren/Funktionen aus. Jene, welche nur im Package Body definiert sind, sind nicht ersichtlich. Ich hoffe aber noch auf eine solche View à la DBA_PROCEDURES, welche mir diese Prozesse auch noch offenbart. Das werden Sie in der Datenbank SO nicht finden, da Oracle das weder zur Security, noch zur Ermittlung von Ausführungen benötigt. Der Datenbank ist es völlig egal, welche Prozeduren sie in einem Package Body verbauen - das wird nur beim Compile und bei der Ausführung geprüft.
Sie werden sich diesbezüglich dann schon etwas eigenes bauen müssen (über DBA_SOURCE). Und wenn der Package Body gewrapped ist, kommen Sie da überhaupt nicht dran (zum Glück, sonst hätte man als ISV ein echtes Problem).
Viele Grüsse
Jörg Sobottka
Delta Energy Solution AG
- 15 Nov 2011, 11:17 am
-
Cornel Brücher Premium Member Group moderatorThe company name is only visible to registered members.Re^4: Private / Public erkennen?
Hallo Herr Schafroth,
die präzise Anntwort auf Ihre Frage: Nein!
Unpräziser und ausführlicher:
SELECT *
FROM user_source u1
LEFT OUTER JOIN user_source u2
ON u2.name = u1.name
AND u2.type = 'PACKAGE'
AND regexp_like(lower(u1.text),'procedure')
AND regexp_substr(lower(u1.text),'procedure [[:alpha:]_]+')
= regexp_substr(lower(u2.text),'procedure [[:alpha:]_]+')
WHERE u1.type = 'PACKAGE BODY'
AND regexp_like(lower(u1.text),'procedure')
(Nur ein Quickhack...)
Commit;
Cornel Brücher
- 15 Nov 2011, 3:00 pm
-
Jörg SobottkaThe company name is only visible to registered members.Re^5: Private / Public erkennen?
Hallo Herr Brücher,
Cornel Brücher schrieb:
Unpräziser und ausführlicher:
SELECT *
FROM user_source u1
LEFT OUTER JOIN user_source u2
ON u2.name = u1.name
AND u2.type = 'PACKAGE' AND regexp_like(lower(u1.text),'procedure')
AND regexp_substr(lower(u1.text),'procedure [[:alpha:]_]+') = regexp_substr(lower(u2.text),'procedure [[:alpha:]_]+')
WHERE u1.type = 'PACKAGE BODY'
AND regexp_like(lower(u1.text),'procedure')
(Nur ein Quickhack...)
ein Quickhack meinerseits:
select owner, name, substr(ltrim(upper(d.text)), regexp_instr(ltrim(upper(d.text)),'PROCEDURE',1,1,1))
from dba_source d where d.type = 'PACKAGE BODY' and instr(upper(d.text), 'PROCEDURE') >0
minus
select owner, name, substr(ltrim(upper(d.text)), regexp_instr(ltrim(upper(d.text)),'PROCEDURE',1,1,1))
from dba_source d where d.type = 'PACKAGE' and instr(upper(d.text), 'PROCEDURE') >0;
Das könnte schon reichen, wenn man Header und Body schön formatiert (d.h. nur das Schlüsselwort PROCEDURE und den Namen auf eine Zeile, alle weiteren Parameter, ";" etc. auf die nächste Zeile).
Wenn alles auf einer Zeile steht, könnte man z.B. grundsätzlich nach dem Namen der Prozedur ein Leerzeichen haben, dann sucht man eben im verbliebenen Ergebnisstring nach dem Leerzeichen und schneidet den Rest ab...
Dann hätte man mindestens mal alle Prozeduren inkl. Owner und Package Body Name, die es nicht in einem Header gibt... Den Rest bekommt glaube ich jeder selbst hin...
viele Grüsse und schönen Abend
Jörg Sobottka
Delta Energy Solution AG
This post was modified on 15 Nov 2011 at 05:44 pm.- 15 Nov 2011, 5:42 pm
-
Cornel Brücher Premium Member Group moderatorThe company name is only visible to registered members.Re^6: Private / Public erkennen?
Jörg Sobottka schrieb:
...
Das könnte schon reichen, wenn man Header und Body schön formatiert (d.h. nur das Schlüsselwort PROCEDURE und den Namen auf eine Zeile, alle weiteren Parameter, ";" etc. auf die nächste Zeile).
Wenn alles auf einer Zeile steht, könnte man z.B. grundsätzlich nach dem Namen der Prozedur ein Leerzeichen haben, dann sucht man eben im verbliebenen Ergebnisstring nach dem Leerzeichen und schneidet den Rest ab... Dann hätte man mindestens mal alle Prozeduren inkl. Owner und Package Body Name, die es nicht in einem Header gibt... Den Rest bekommt glaube ich jeder selbst hin...
...
Hallo Herr Sobottka,
elegante Lösung. Das Problem mit der Formatierung des Codes können Sie lösen, wenn sie meinen regexp_substr(lower(u1.text),'procedure [[:alpha:]_]+') einsetzen. Der schneidet hinter dem Prozedurnamen ab, egal was danach noch in der Zeile steht.
Viele Grüsse
Cornel Brücher
- 15 Nov 2011, 6:30 pm
-
Matthias Rogel Premium MemberThe company name is only visible to registered members.Re: Private / Public erkennen?
Hallo Herr Schafroth,
wozu das ?
wieso interessieren Sie sich in einem automatisierten Prozess für "private" functions / procedures ?
Was ist hier ihr Anliegen ?
Untersuchen Sie beispielsweise auch java-Klassen nach privaten Methoden ?
Grüße
M. Rogel
- 15 Nov 2011, 8:53 pm
