如何列出PL/SQL包中定义的所有记录及结构信息?
如何查询Oracle包中定义的记录类型及结构
我知道可以通过以下SQL查询数据库中定义的对象:
select * from user_objects --where object_type='TYPE'
但无法用这个方法列出包内定义的记录类型。比如执行以下创建语句后,上述查询只会返回对象类型t,无法获取包a里定义的记录类型b:
CREATE TYPE t IS OBJECT ( q integer, b INTEGER ); CREATE OR REPLACE PACKAGE a as type b is record( c integer ); end;
要查询包内的记录类型及其结构,可通过以下两种方法实现:
方法1:解析包源代码(通用版本)
通过查询user_source视图获取包的定义文本,从中提取记录类型信息:
-- 查询包含记录类型的包及对应的定义片段 SELECT name AS package_name, text AS record_definition FROM user_source WHERE type = 'PACKAGE' AND text LIKE '%TYPE % IS RECORD%' ORDER BY name, line;
如果需要精准提取记录名、字段和类型,可结合正则表达式:
SELECT name AS package_name, REGEXP_SUBSTR(text, 'TYPE (\w+) IS RECORD', 1, 1, 'i', 1) AS record_name, REGEXP_SUBSTR(text, '\((.*?)\)', 1, 1, 'n', 1) AS record_fields FROM user_source WHERE type = 'PACKAGE' AND REGEXP_LIKE(text, 'TYPE (\w+) IS RECORD', 'i');
方法2:使用PL/SQL专用字典视图(Oracle 12c及以上)
Oracle 12c及后续版本提供了专门的字典视图,可直接查询PL/SQL类型及其属性:
-- 查询包内所有记录类型 SELECT t.owner, t.type_name AS record_name, t.package_name FROM all_plsql_types t WHERE t.package_name IS NOT NULL AND t.type_kind = 'RECORD' AND t.owner = USER;
-- 查询记录类型的字段名称及对应类型 SELECT a.owner, a.type_name AS record_name, a.package_name, a.attribute_name AS field_name, a.attribute_type AS field_type FROM all_plsql_type_attributes a WHERE a.package_name IS NOT NULL AND a.owner = USER ORDER BY a.type_name, a.attribute_position;
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

