如何检查Oracle 8中的包中是否存在过程?

时间:2012-11-07 09:46:57

标签: oracle plsql oracle8i

我在这里看到一些解决方案来检查包中的过程,但它们只适用于oracle 9或10 +。

但是有可能在Oracle 8i中进行此检查吗?在Oracle 8中,您没有DBA_PROCEDURES或类似的东西。

任何帮助都会很棒。

5 个答案:

答案 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_PROCEDURESALL_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>