#DBMS_PICKLER

DBMS_PICKLER包提供了一个内置的函数,用于查询UDT元数据信息。

# GET_TYPE_SHAPE

DBMS_PICKLER.GET_TYPE_SHAPE (
    FULLTYPENAME     IN  VAECHAR,
    TYPOID           OUT BIGINT,
    VERSION          OUT INT,
    TDS              OUT RAW,
    INSTANTIABLE     OUT VARCHAR,
    SUPERTYPE_OWNER  OUT VARCHAR,
    SUPERTYPE_NAME   OUT VARCHAR,
    ATTR_RC          OUT SYS_REFCURSOR,
    SUBTYPE_RC       OUT SYS_REFCURSOR
) return INT;

GET_TYPE_SHAPE函数实现了从SYS.USER$等基础表中查询类型信息及其子类型信息。

函数参数信息:

参数 描述 类型 IN/OUT
返回值 tdsFlag,标识TDS数据是否通过LOB发送,非0表示LOB发送。 INT OUT
FULLTYPENAME 自定义类型全名称,oracle将其作为in参数。 VARCHAR IN/OUT
TYPOID 自定义类型 oid。 BIGINT OUT
VERSION 类型版本号, alter type 后自增,初始版本为1。 INT OUT
TDS Type Descriptor Source,包含 attr numbers,n个属性type code;如果tdsFlag为1,标识该字段是LOB发送。 RAW OUT
INSTANTIABLE 是否可实例化,通常为YES。 VARCHAR OUT
SUPERTYPE_OWNER 父类型所属schema。 VARCHAR OUT
SUPERTYPE_NAME 父类型名称。 VARCHAR OUT
ATTR_RC 属性元数据信息 cursor。 SYS_REFCURSOR OUT
SUBTYPE_RC 子类型元数据信息cursor。 SYS_REFCURSOR OUT

ATTR_RC属性元数据信息:

字段 说明
1 固定值,1,image format
NAME 属性名称。
ATTRIBUTE 属性序号,表示类型的第几个属性;从1开始。
DTypeName 类型名称,比如VARCHAR2,NUMBER,NVARCHAR2,CLOB。
USER.NAME 属性类型(是自定义类型)owner的名称,普通类型为null。
ATTR_TOID 属性的type id,如果属性类型也是自定义类型。
ATTRTYPINS 类型是否可实例化,通常都是YES。
SUP_TYP_OWNER 父类型的schema,如果属性类型有父类型。
SUP_TYP_NAME 父类型的type name,如果属性类型有父类型。

SUBTYPE_RC子类型元数据信息:

字段 说明
1 固定值,1,image format
NAME 子类型owner的名称。
NAME 子类型名称。
OID 子类型的type oid

示例:

-- 创建UDT类型
CREATE OR replace TYPE SALES.UDT_VARRAY_TYP IS object(id INT, value VARCHAR(20));
/

-- 启用dbms_output
SET serveroutput ON;
-- 匿名块
DECLARE
   tds_flag INT;
   full_type_name VARCHAR(255) := 'SALES.UDT_VARRAY_TYP';
   typeoid BIGINT;
   version INT;
   tds RAW(8000);
   instantiable VARCHAR(255);
   sup_owner VARCHAR(255);
   sup_name VARCHAR(255);
   attr_rc SYS_REFCURSOR;
   subtype_rc SYS_REFCURSOR;
BEGIN
   tds_flag := sys.dbms_pickler.get_type_shape(full_type_name, typeoid, version, tds, instantiable, sup_owner, sup_name, attr_rc, subtype_rc);
   DBMS_OUTPUT.PUT_LINE('tds flag: ' || tds_flag);
   DBMS_OUTPUT.PUT_LINE(' full_type_name: ' || full_type_name);
   DBMS_OUTPUT.PUT_LINE(' typeoid: ' || typeoid);
   DBMS_OUTPUT.PUT_LINE(' version: ' || version);
   DBMS_OUTPUT.PUT_LINE(' tds: ' || tds);
   DBMS_OUTPUT.PUT_LINE(' instantiable: ' || instantiable);
   DBMS_OUTPUT.PUT_LINE(' sup_owner: ' || sup_owner);
   DBMS_OUTPUT.PUT_LINE(' sup_name: ' || sup_name);
   DBMS_SQL.RETURN_RESULT(attr_rc);
   DBMS_SQL.RETURN_RESULT(subtype_rc);
END;
/

-- result
tds flag: 0
 full_type_name: SALES.UDT_VARRAY_TYP
 typeoid: 65581
 version: 1
 tds: 1C0000000000000001020004000100000000001A0002000000000000
 instantiable: YES
 sup_owner:
 sup_name:


ResultSet #1

1 NAME                                                               ATTRIBUTE# DECODE(A.ATTR_TOID,0                                             DECODE(BITAND(A.PROP
ATTR_TOID ATTRTYPINS SUP_TYP_OWNER                                                    SUP_TYP_NAME
------------ ---------------------------------------------------------------- ------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------------------- ---------- ---------------------------------------------------------------- ----------------------------------------------------------------
1 ID                                                                          1 INTEGER
4 YES
1 VALUE                                                                       2 VARCHAR
26 YES


ResultSet #2

1 NAME                                                             NAME                                                                              TOID
------------ ---------------------------------------------------------------- ---------------------------------------------------------------- ---------------------

pdf-btn 下载文档
copy-btn 复制链接