Получите метаданные хранимой процедуры для процедуры в пакете Oracle с помощью ADO.NET

Я пытаюсь получить метаданные хранимой процедуры (имя процедуры, типы параметра, названия параметра и т.д.) для процедуры, объявленной в пакете Oracle, с помощью стандартного ADO.NET API - DbConnection. Вызов GetSchema. Я использую драйвер ODP.

Я вижу, что Пакет перечислен в 'Пакетах' и наборах метаданных 'PackageBodies'. Параметр процедуры появляется в наборах 'ProcedureParameters' и 'Аргументах'. Я не вижу способ добраться до информации о процедуре через метаданные пакета. Даже если процедура не имеет никаких параметров существует строка в наборе 'ProcedureParameters' для этой процедуры.

Мой вопрос: Для получения метаданных процедуры, я должен запросить набор 'ProcedureParameters' и искать запись с необходимым именем пакета? Я могу затем создать метаданные процедуры на основе информации о параметре. Существует ли более короткий или более быстрый способ получить ту же информацию?

9
задан APC 18 May 2010 в 14:05
поделиться

2 ответа

С помощью Боба я использовал следующий запрос, чтобы получить список хранимых процедур, определенных в пакете.

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. Учетные данные пользователя, которые вы используете для выполнения запроса, могут не иметь привилегий «выбрать» в этой таблице.

8
ответ дан 4 December 2019 в 09:12
поделиться

Я не уверен, как вы это получили используя 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>';

Поделитесь и наслаждайтесь.

15
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: