3

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

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

任何帮助都会很棒。

4

5 回答 5

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;
于 2012-11-07T10:53:24.173 回答
0

不确定这是否适用于 Oracle 8,但试试这个:

select * 
from   all_procedures 
where  object_name = '<package_name>' 
  and  procedure_name = '<proc_name>'
于 2012-11-07T10:00:39.600 回答
0

正如在这个问题中建议的那样,您可能会被迫扫描到all_source视图中。

于 2012-11-07T10:26:32.603 回答
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及以上

于 2012-11-07T10:47:09.410 回答
-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>
于 2012-11-07T10:14:45.150 回答