比如:
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可列出包定义的函数\存储过程,但也只是描述其变量声明,并没有区分是函数还是存储过程.请大侠指点,谢谢!
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可列出包定义的函数\存储过程,但也只是描述其变量声明,并没有区分是函数还是存储过程.请大侠指点,谢谢!
对于单独定义的函数或者过程,可以通过all_objects.object_type字段判断。
我已经用你说的方法试过(是可以查出),
但是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;
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)