繁体   English   中英

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

[英]How can I check if a procedure exists in a package in Oracle 8?

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

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

任何帮助都会很棒。

使用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;

不确定这是否适用于Oracle 8,但请尝试以下方法:

select * 
from   all_procedures 
where  object_name = '<package_name>' 
  and  procedure_name = '<proc_name>'

正如在此问题中建议您可能被迫扫描到all_source视图。

这应该适用于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及更高版本中

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM