您似乎在谈论的是一种 PL/SQL 记录类型。仅当编译存储的 PL/SQL 以收集 PLSCOPE 标识符时才可能检查 PL/SQL 记录类型(否则,您的查询将没有数据)。
我将在这里发布一个这样做的例子。但首先让我说,我从来没有为任何生产代码这样做过。根据我的经验,您尝试做的不是“正常的”,也许您需要重新评估您的方法。不管怎样,就在这里。
-- First, tell your session that all compilations should collect
-- PLSCOPE identifiers. If you neglect to do this, you can always ALTER
-- a package later to recompile it with PLSCOPE identifiers as follows:
-- alter package mypackage compile
-- plscope_settings='IDENTIFIERS:ALL' reuse settings;
ALTER SESSION SET plscope_settings='IDENTIFIERS:ALL';
CREATE OR REPLACE PACKAGE so_test1 AS
TYPE Item IS RECORD (
id NUMBER,
Description VARCHAR2(30),
Category VARCHAR2(30)
);
END so_test1;
-- Now, the information you want will be in DBA_IDENTIFIERS, which is
-- stored hierarchically. This query will print that hierarchy, starting
-- with the definition of your "ITEM" record type.
WITH v AS (
SELECT Line,
Col,
NAME,
TYPE,
USAGE,
USAGE_ID,
USAGE_CONTEXT_ID
FROM USER_IDENTIFIERS
WHERE Object_Name = 'SO_TEST1'
AND Object_Type = 'PACKAGE'
)
SELECT LPAD(' ', 2*(Level-1)) || NAME,
TYPE, USAGE, USAGE_CONTEXT_ID
FROM v
START WITH name = 'ITEM' and type = 'RECORD' and usage = 'DECLARATION'
CONNECT BY PRIOR USAGE_ID = USAGE_CONTEXT_ID
ORDER SIBLINGS BY Line, Col
/
样本输出:
+---------------+--------------------+-------------+------------------+
| NAME | TYPE | USAGE | USAGE_CONTEXT_ID |
+---------------+--------------------+-------------+------------------+
| ITEM | RECORD | DECLARATION | 1 |
| ID | VARIABLE | DECLARATION | 2 |
| NUMBER | NUMBER DATATYPE | REFERENCE | 3 |
| DESCRIPTION | VARIABLE | DECLARATION | 2 |
| VARCHAR2 | CHARACTER DATATYPE | REFERENCE | 5 |
| CATEGORY | VARIABLE | DECLARATION | 2 |
| VARCHAR2 | CHARACTER DATATYPE | REFERENCE | 7 |
+---------------+--------------------+-------------+------------------+