我有一个包裹:
CREATE PACKAGE my_pkg
IS
g_var NUMBER;
END;
/
有什么方法可以查询 SYS 视图,发现这个包有这个全局变量?我对显式变量名和数据类型感兴趣。
PS 解析 user_source 不算。
编辑:我想在不引入 getter/setter 函数的情况下做到这一点。
我有一个包裹:
CREATE PACKAGE my_pkg
IS
g_var NUMBER;
END;
/
有什么方法可以查询 SYS 视图,发现这个包有这个全局变量?我对显式变量名和数据类型感兴趣。
PS 解析 user_source 不算。
编辑:我想在不引入 getter/setter 函数的情况下做到这一点。
没有包含此信息的系统视图。您可能在这里可以做的最好的事情是使用 user_source 或 all_source (我知道您说过这不算数,但我认为这是您可以在这里做的最好的事情)。
话虽如此,如果您对全局变量使用标准 g_ 前缀,那么解析 all_source 真的那么糟糕吗?我认为您可以编写一个 PL/SQL 来遍历源代码并搜索“g_”。这可能需要一些调整和实验,但我认为值得一试。
您可以使用包中的函数公开它:
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;
供我自己参考,这是一个从数据字典中获取该信息的查询 -
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