Представление/системная таблица базы данных Oracle для проверки того, является ли данная часть пакета процедурой или функцией.
-
23-09-2019 - |
Вопрос
Я использую Oracle системные таблицы чтобы получить метаданные о пакетах в нашей базе данных.
Вот один из моих запросов:
select AP.PROCEDURE_NAME
from ALL_PROCEDURES ap
where ap.object_name = :object_name
and ap.owner=:owner
and ap.procedure_name is not NULL
and ap.procedure_name like :procedure_name
Я также хочу узнать, является ли данный объект функцией, процедурой или типом.Кажется, я не могу найти прямой способ получить данные непосредственно из таблицы.
Пожалуйста, обрати внимание: Я не хочу анализировать его из all_sources.
Решение
Оказывается, есть представление all_arguments, где можно получить все параметры метода в пакете.Когда метод является функцией, существует аргумент с нулевым именем, представляющий возвращаемое значение.Таким образом, если вы присоединитесь к all_arguments, вы сможете определить, является ли данная запись all_procedures функцией или процедурой.Далее следует пример, показывающий такой выбор.
select CASE (Select count(*) from ALL_ARGUMENTS aa
where aa.object_name=ap.procedure_name
and aa.object_id = ap.object_id
and argument_name is null)
WHEN 1 THEN 'FUNCTION'
WHEN 0 THEN 'PROCEDURE'
ELSE ''
END as is_function, ap.*
from all_procedures ap
where ap.object_name like '<package name>'
Другие советы
SQL> select distinct object_type from user_procedures;
OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
Я подозреваю, что у человека не будет выбора.По крайней мере, он хорошо отформатирован — все типы начинаются с TYPE и так далее.
Вы можете использовать SQL*Plus и DESC
команда, которая работает с пакетами:
SQL> desc dbms_application_info;
PROCEDURE READ_CLIENT_INFO
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 OUT
PROCEDURE READ_MODULE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 OUT
ACTION_NAME VARCHAR2 OUT
PROCEDURE SET_ACTION
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_CLIENT_INFO
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
CLIENT_INFO VARCHAR2 IN
PROCEDURE SET_MODULE
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MODULE_NAME VARCHAR2 IN
ACTION_NAME VARCHAR2 IN
PROCEDURE SET_SESSION_LONGOPS
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
RINDEX BINARY_INTEGER IN/OUT
SLNO BINARY_INTEGER IN/OUT
OP_NAME VARCHAR2 IN DEFAULT
TARGET BINARY_INTEGER IN DEFAULT
CONTEXT BINARY_INTEGER IN DEFAULT
SOFAR NUMBER IN DEFAULT
TOTALWORK NUMBER IN DEFAULT
TARGET_DESC VARCHAR2 IN DEFAULT
UNITS VARCHAR2 IN DEFAULT
Перебирая пакеты и анализируя результаты (это более простая структура для анализа, чем DBA_SOURCE), вы можете получить то, что хотите.Предостережение, которое следует запомнить;пакеты поддерживают перегрузку, поэтому вы можете использовать оба FUNCTION foo(date) RETURN date
, и PROCEDURE foo(varchar)
.Сопоставления только по имени может быть недостаточно.