Я пытаюсь получить метаданные хранимой процедуры (имя процедуры, типы параметра, названия параметра и т.д.) для процедуры, объявленной в пакете Oracle, с помощью стандартного ADO.NET API - DbConnection. Вызов GetSchema. Я использую драйвер ODP.
Я вижу, что Пакет перечислен в 'Пакетах' и наборах метаданных 'PackageBodies'. Параметр процедуры появляется в наборах 'ProcedureParameters' и 'Аргументах'. Я не вижу способ добраться до информации о процедуре через метаданные пакета. Даже если процедура не имеет никаких параметров существует строка в наборе 'ProcedureParameters' для этой процедуры.
Мой вопрос: Для получения метаданных процедуры, я должен запросить набор 'ProcedureParameters' и искать запись с необходимым именем пакета? Я могу затем создать метаданные процедуры на основе информации о параметре. Существует ли более короткий или более быстрый способ получить ту же информацию?
С помощью Боба я использовал следующий запрос, чтобы получить список хранимых процедур, определенных в пакете.
SELECT a.OBJECT_NAME,p.PROCEDURE_NAME FROM SYS.ALL_OBJECTS a, SYS.ALL_PROCEDURES p WHERE a.OBJECT_NAME = p.OBJECT_NAME AND a.OBJECT_TYPE = 'PACKAGE' AND a.OWNER = '" + ownerName + "' AND p.PROCEDURE_NAME IS NOT NULL"
Возвращает все хранимые процедуры для конкретного пользователя. Затем я могу использовать коллекцию «Параметры процедуры», чтобы получить для них информацию о параметрах.
ПРИМЕЧАНИЕ. Не запрашивайте таблицу SYS.DBA_PROCEDURES. Учетные данные пользователя, которые вы используете для выполнения запроса, могут не иметь привилегий «выбрать» в этой таблице.
Я не уверен, как вы это получили используя ADO.NET, но вы можете напрямую запросить базу данных для получения этой информации следующим образом:
SELECT *
FROM SYS.DBA_PROCEDURES
WHERE OBJECT_TYPE = 'PACKAGE' AND
OBJECT_NAME = '<your package name here>' AND
PROCEDURE_NAME IS NOT NULL;
После выполнения вышеуказанного запроса у вас будет набор результатов, который, среди прочего, содержит PROCEDURE_NAME. Учитывая имя пакета и PROCEDURE_NAME, вы можете найти информацию о параметрах, используя следующий запрос:
SELECT *
FROM SYS.ALL_ARGUMENTS
WHERE PACKAGE_NAME = '<your package name here>' AND
OBJECT_NAME = '<PROCEDURE_NAME from query above>';
Поделитесь и наслаждайтесь.