You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何列出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:20:28