Interne Package Prozeduren und Funktionen als View auflisten

CREATE OR REPLACE function EDV.f_extract_proc_name(p_zeile varchar, p_typ char) return varchar2 is
-- ***********************************************************************************************
--    NAME          f_extract_proc_name
--
--    DESCRIPTION   Ermittelt aus einer source Zeile (aus all_source) mit type = 'PACKAGE BODY'
--                  den Typ oder den Namen internenr Proceduren/Funktionen 
--                  ohne Parameter in Abhängikeit von p_typ  
--
--    PARAMETER:    p_zeile 
--                  p_typ 'N' -> der Name der Procedure/Function wird ermittelt
--                  oder 'T'  -> der Typ (PROCEDURE oder FUNCTION) wird ermittelt 
--
--
--    RETURNS       p_typ='N' -> Namen der Procedure/Function ohne Parameter
--                  p_typ='T' -> PROCEDURE oder FUNCTION
--
--
--    CREATED       08.11.2011 Gregor Neveling
--
-- ***********************************************************************************************
v_pos   number;
v_zeile varchar2(4000);
r_zeile varchar2(4000);
i       number;
begin
   if p_typ = 'T' then
      if ltrim(upper(p_zeile)) like 'PROCEDURE %' then
         return('PROCEDRUE');
      elsif ltrim(upper(p_zeile)) like 'FUNCTION %' then
         return('FUNCTION');
      else
         return(null);
      end if;
   elsif p_typ = 'N' then
      if ltrim(upper(p_zeile)) like 'PROCEDURE %' then
         v_zeile := upper(substr(ltrim(p_zeile), 11,255));
         i := 1;
         while i <= length(v_zeile) and substr(v_zeile,i ,1) not in (chr(10), chr(40))
         loop
            r_zeile := r_zeile||substr(v_zeile,i ,1);
            i := i + 1;
         end loop; 
         return ltrim(rtrim(r_zeile));
      elsif ltrim(upper(p_zeile)) like 'FUNCTION %' then
         v_zeile := upper(substr(ltrim(p_zeile), 10,255)); 
         i := 1;
         while i <= length(v_zeile) and substr(v_zeile,i ,1) not in (chr(10), chr(40))
         loop
            r_zeile := r_zeile||substr(v_zeile,i ,1);
            i := i + 1;
         end loop; 
         return ltrim(rtrim(r_zeile));
      else
         return(null);
      end if;
   else
      return(null);
   end if;
end;
/
CREATE OR REPLACE FORCE VIEW v_package_procs (owner, NAME, typ, soname)
AS
   SELECT owner, NAME, f_extract_proc_name (text, 'T') typ,
          f_extract_proc_name (text, 'N') soname
     FROM all_source
    WHERE owner = 'EDV'
      AND TYPE = 'PACKAGE BODY'
      AND (   LTRIM (UPPER (text)) LIKE 'PROCEDURE %'
           OR LTRIM (UPPER (text)) LIKE 'FUNCTION %'
          );