パッケージ内のプロシージャをチェックするための解決策がいくつかありますが、それらは 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_PROCEDURES
orALL_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>