Oracle

Oracle

Posts 1-8 of 8
  • Fabian Schafroth
    Fabian Schafroth
    The 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
  • Jörg Sobottka
    Jörg Sobottka
    The 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.
  • Fabian Schafroth
    Fabian Schafroth
    The 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
  • Jörg Sobottka
    Jörg Sobottka
    The 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
  • Cornel Brücher
    Cornel Brücher    Premium Member   Group moderator
    The 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
  • Jörg Sobottka
    Jörg Sobottka
    The 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.
  • Cornel Brücher
    Cornel Brücher    Premium Member   Group moderator
    The 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
  • Matthias Rogel
    Matthias Rogel    Premium Member
    The 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