比如:
create or replace package SPK_A is
  lv_empno  number;
  lv_deptno number;
  function  FUN_A(in_empno number)  return varchar2;
  function  SP_A(in_deptno number) return varchar2;
end;
/那么, 能在数据字典中能找出FUN_A和SP_A,并区分前者是函数,后者是存储过程?(1)dba_procedures只能查找出非包定义(即独立)的函数或存储过程(且不区分是函数还是存储过程),如下面的函数FUN_OUT.
但不能找出包定义的函数或过程.
create or replace function FUN_OUT return number is
begin
    null;
end;
/(2)all_arguments可列出包定义的函数\存储过程,但也只是描述其变量声明,并没有区分是函数还是存储过程.请大侠指点,谢谢!

解决方案 »

  1.   

    1) 关于程序包的定义可以在user_source中获得,如 select * from user_source us where us.name='SPK_A'2)all_arguments中无法判断出包中定义的是函数还是过程,可以参考1)中通过编码实现。
       对于单独定义的函数或者过程,可以通过all_objects.object_type字段判断。
      

  2.   

    谢谢lynx,
    我已经用你说的方法试过(是可以查出),
    但是SQL很复杂,而且感觉有点杀鸡用牛刀.
    不知道大家有没有更好的方法,可以从数据字典直接找到(还是Oracle内部函数,没有公开?).以下是我的测试代码:
    --------------------------------------------------------------1.创建去多个空格函数(仅留一个空格)
    create or replace function fun_rep2null(in_text varchar2, in_old_str varchar2, in_new_str varchar2) return varchar2 is
      lv_text    varchar2(1000);
      lv_old_str varchar2(50);
      lv_new_str varchar2(50);
      lv_pos     number;
    begin
      lv_text := upper(in_text);
      lv_old_str := upper(in_old_str);
      lv_new_str := upper(in_new_str);
      lv_pos  := instr(lv_text,in_old_str,1);
      while lv_pos>0 loop
        lv_text := replace(lv_text,lv_old_str,lv_new_str);
        lv_pos  := instr(lv_text,in_old_str,1);
      end loop;
      return lv_text;
    end;
    /--2.从user_source查出FUNCTION
    select distinct fun, type from
    (
      select text, 
             name       parent_name, 
             type       parent_type,
             'FUNCTION' type, 
             decode(instr(text,'FUNCTION',1),
                    0,
                    null,
                    substr(text,
                    instr(text,'FUNCTION',1)+9,
                    decode(instr(text, '(', 1),
                           0,
                           instr(text, ' ', instr(text,'FUNCTION',1)+9, 1) - (instr(text,'FUNCTION',1)+9),
                           instr(text, '(', 1)-(instr(text,'FUNCTION',1)+9)
                          )
                    )
                   ) FUN 
      from 
      (
        select name, type, line, fun_rep2null(text,'  ', ' ') text from user_source
      
      ) t
      where instr(upper(text),'FUNCTION',1)<>0
    )
    where parent_type not in ('FUNCTION')
      and fun is not null
      
     
    --3.--2.从user_source查出PROCEDURE
    select distinct fun, type from
    (
    select distinct SP, type from
    (
      select text, 
             name       parent_name, 
             type       parent_type,
             'PROCEDURE' type, 
             decode(instr(text,'PROCEDURE',1),
                    0,
                    null,
                    substr(text,
                    instr(text,'PROCEDURE',1)+9,
                    decode(instr(text, '(', 1),
                           0,
                           instr(text, ' ', instr(text,'PROCEDURE',1)+9, 1) - (instr(text,'PROCEDURE',1)+9),
                           instr(text, '(', 1)-(instr(text,'PROCEDURE',1)+9)
                          )
                    )
                   ) SP 
      from 
      (
        select name, type, line, fun_rep2null(text,'  ', ' ') text from user_source
      
      ) t
      where instr(upper(text),'PROCEDURE',1)<>0
    )
    where parent_type not in ('PROCEDURE')
      and SP is not null;
      
      

  3.   

    如果仅仅只是想知道包里定义的是过程还是函数,下面的代码也许更清晰些,不过效率不好说:
    select *
      from user_source us
     where us.name = 'SPK_A'
       and us.type = 'PACKAGE'
       and (instr(upper(us.name), 'PROCEDURE') > 0 or
           instr(upper(us.name), 'FUNCTION') > 0)