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

Bar*_*rtb 3 oracle plsql oracle8i

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

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

任何帮助都会很棒.

Daz*_*zaL 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;
Run Code Online (Sandbox Code Playgroud)