我在这里看到一些解决方案来检查包中的过程,但它们只适用于oracle 9或10 +。
但是有可能在Oracle 8i中进行此检查吗?在Oracle 8中,您没有DBA_PROCEDURES或类似的东西。
任何帮助都会很棒。
答案 0 :(得分:6)
使用DBMS_DESCRIBE。它可以在8i中使用。
请参阅:http://docs.oracle.com/cd/A87860_01/doc/index.htm
如果函数的过程不存在,它将返回ORA-20001错误。
例如
declare
V_YOUR_PROC_NAME varchar2(100) := 'MY_PACK.FUNC';
function proc_exists(p_name varchar2) return boolean
is
overload dbms_describe.number_table;
position dbms_describe.number_table;
c_level dbms_describe.number_table;
arg_name dbms_describe.varchar2_table;
dty dbms_describe.number_table;
def_val dbms_describe.number_table;
p_mode dbms_describe.number_table;
length dbms_describe.number_table;
precision dbms_describe.number_table;
scale dbms_describe.number_table;
radix dbms_describe.number_table;
spare dbms_describe.number_table;
idx integer := 0;
PROC_NOT_FOUND exception;
pragma exception_init(PROC_NOT_FOUND, -20001);
begin
dbms_describe.describe_procedure(
p_name,null,null,
overload,position,
c_level,arg_name,
dty,def_val,p_mode,
length,precision,
scale,radix,spare);
return true;
exception
when PROC_NOT_FOUND
then
return false;
end;
begin
if (proc_exists(V_YOUR_PROC_NAME))
then
dbms_output.put_line(' found');
else
dbms_output.put_line(' not found');
end if;
end;
答案 1 :(得分:0)
不确定这是否适用于Oracle 8,但请尝试以下方法:
select *
from all_procedures
where object_name = '<package_name>'
and procedure_name = '<proc_name>'
答案 2 :(得分:0)
正如this question中建议的那样,您可能会被迫扫描到all_source
视图。
答案 3 :(得分:0)
这应该适用于Oracle 8i(由于上线,我无法对此进行测试)
CREATE OR REPLACE FUNCTION check_for_procedure
(procedure_name IN VARCHAR2)
RETURN BOOLEAN
AS
procedure_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO procedure_count
FROM USER_SOURCE
WHERE TYPE = 'PROCEDURE'
AND NAME = procedure_name;
RETURN 1 = procedure_count;
EXCEPTION
WHEN OTHERS
THEN
RETURN FALSE;
END check_for_procedure;
不幸的是,无法使用USER_PROCEDURES
或ALL_PROCEDURES
,因为它只存在于Oracle 9i及更高版本中
答案 4 :(得分:-1)
select * from all_objects
where object_name = <object name>
and object_type='PROCEDURE'
不同的对象类型,它也应该在oracle 8中工作。
OBJECT_TYPE
1 JOB CLASS
2 INDEX
3 TABLE SUBPARTITION
4 INDEXTYPE
5 PROCEDURE
6 JAVA CLASS
7 SCHEDULE
8 WINDOW
9 WINDOW GROUP
10 JAVA RESOURCE
11 TABLE PARTITION
12 TABLE
13 TYPE
14 VIEW
15 FUNCTION
16 PROGRAM
17 SYNONYM
18 CONSUMER GROUP
19 EVALUATION CONTEXT
20 DIRECTORY
21 OPERATOR
22 PACKAGE
23 SEQUENCE
24 XML SCHEMA
25 INDEX PARTITION
26 LOB
在包中找到具体程序
SELECT *
FROM ALL_PROCEDURES
WHERE OBJECT_TYPE = 'PACKAGE' AND
OBJECT_NAME = <package name> AND
PROCEDURE_NAME = <procedure name>