Получите метаданные хранимой процедуры для процедуры в пакете Oracle, используя ADO.NET - PullRequest
9 голосов
/ 18 мая 2010

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

Я вижу, что Пакет указан в коллекциях метаданных «Пакеты» и «Пакеты тел». Параметр процедуры появляется в коллекциях «Аргументы» и «ProgramParameters ». Я не вижу способа получить информацию о процедуре через метаданные пакета. Даже если процедура не имеет каких-либо параметров, для этой процедуры в коллекции «ModuleParameters» есть строка.

Мой вопрос: чтобы получить метаданные процедуры, нужно ли запрашивать коллекцию «ProgramParameters »и искать запись с требуемым именем пакета? Затем я могу построить метаданные процедуры на основе информации о параметрах. Есть ли более короткий или более быстрый способ получить ту же информацию?

Ответы [ 2 ]

15 голосов
/ 18 мая 2010

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

Делись и наслаждайся.

8 голосов
/ 28 мая 2010

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

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"

Возвращает все хранимые процедуры для конкретного пользователя. Затем я могу использовать коллекцию «ProgramParameters »для получения информации о параметрах для них.

ПРИМЕЧАНИЕ. Не запрашивайте таблицу SYS.DBA_PROCEDURES. У учетных данных пользователя, которые вы используете для выполнения запроса, могут не быть привилегии 'select' для этой таблицы.

...