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_PROCEDURESorALL_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 に答える