Найти глобальные переменные пакета из словаря данных - PullRequest
4 голосов
/ 16 декабря 2009

У меня есть пакет:

CREATE PACKAGE my_pkg
IS
g_var NUMBER;
END;
/

Можно ли как-нибудь запросить представления SYS, чтобы обнаружить, что этот пакет имеет эту глобальную переменную? Меня интересует явное имя переменной и тип данных.

P.S. Парсинг user_source не считается.

Редактировать: Я хотел бы сделать это без введения функций получения / установки.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2009

Нет системного представления, содержащего эту информацию. Лучшее, что вы можете здесь сделать, это использовать user_source или all_source (я знаю, вы сказали, что это не считается, но я думаю, что это лучшее, что вы можете здесь сделать).

С учетом сказанного, если вы используете стандартный префикс g_ для своих глобальных переменных, действительно ли парсинг all_source настолько плох? Я думаю, что вы могли бы написать PL / SQL для цикла по источнику и поиска «g_». Это, вероятно, потребует некоторых настроек и экспериментов, но я думаю, что стоит попробовать.

2 голосов
/ 27 марта 2017

Для справки, вот запрос, который получает эту информацию из словаря данных -

select name as variable_name, object_name as package_name, object_type
from dba_identifiers a
 where usage_context_id = 1
   and usage = 'DECLARATION'
   and type = 'VARIABLE'
start with object_type in ('PACKAGE', 'PACKAGE BODY')
connect by prior usage_id = usage_context_id
    and object_name = prior object_name
    and object_type = prior object_type
2 голосов
/ 16 декабря 2009

Вы можете выставить его с помощью функции в пакете:

FUNCTION FN_get_g_var  RETURN number
IS BEGIN   
     return g_var; END
FN_get_g_var ;

А в поле зрения

CREATE VIEW myView AS 
SELECT my_pkg.FN_get_g_var() FROM DUAL;
...