#ANYTYPE
YashanDB中的ANYTYPE类型是数据库内置的一种自定义类型,可以包含任何持久化SQL类型的类型描述,无论类型是命名的还是未命名的,包括对象类型和集合类型。它还可以用于构建新的瞬态类型描述。
# 使用限制
对于ANYTYPE类型数据的使用限制如下:
不能持久化存储。
只能使用CREATE TYPE语句创建新的持久化SQL类型;只能使用接口构造新的瞬态类型ANYTYPE。
# ANYTYPE子程序
STATIC PROCEDURE BeginCreate(typecode IN PLS_INTEGER, atype OUT NOCOPY ANYTYPE)
MEMBER PROCEDURE EndCreate(self IN OUT NOCOPY ANYTYPE)
STATIC FUNCTION GetPersistent(schema_name IN VARCHAR2, type_name IN VARCHAR2, version IN VARCHAR2 DEFAULT NULL) return ANYTYPE
MEMBER PROCEDURE SetInfo(
self IN OUT NOCOPY ANYTYPE,
prec IN PLS_INTEGER,
scale IN PLS_INTEGER,
len IN PLS_INTEGER,
csid IN PLS_INTEGER,
csfrm IN PLS_INTEGER,
atype IN ANYTYPE DEFAULT NULL,
elem_tc IN PLS_INTEGER DEFAULT NULL,
elem_count IN PLS_INTEGER DEFAULT 0)
MEMBER PROCEDURE AddAttr(
self IN OUT NOCOPY ANYTYPE,
aname IN VARCHAR2,
typecode IN PLS_INTEGER,
prec IN PLS_INTEGER,
scale IN PLS_INTEGER,
len IN PLS_INTEGER,
csid IN PLS_INTEGER,
csfrm IN PLS_INTEGER,
attr_type IN ANYTYPE DEFAULT NULL)
BeginCreate通过使用DBMS_TYPES高级包中的类型码TYPECODE常量,开始创建ANYTYPE。SetInfo设置类型的基本信息(精度prec、刻度scale、长度len、字符集csid和字符集格式csfrm,其中csid和csfrm参数仅语法兼容),对于集合类型还需要指定其元素的类型码elem_tc和元素个数elem_count,如果元素类型是集合或对象类型需要额外设置atype参数。- 当
BeginCreate方法创建的是对象类型的ANYTYPE,需要通过调用AddAttr为对象类型添加属性定义,包括属性名aname(不允许属性名为NULL或重复),属性的类型码typecode和类型的基本信息,如果属性类型是集合或对象类型需要额外设置attr_type参数。 EndCreate完成ANYTYPE创建。GetPersistent返回给定集合或对象类型的ANYTYPE定义。
# 使用示例
--example 1
DECLARE
TYPE vc_arr IS TABLE OF VARCHAR(100);
atype anytype;
adata anydata;
arr vc_arr;
ret INT;
BEGIN
anytype.BeginCreate(DBMS_TYPES.TYPECODE_VARRAY, atype);
atype.SetInfo(0, 0, 500, null, null, null, DBMS_TYPES.TYPECODE_VARCHAR);
atype.EndCreate;
anydata.BeginCreate(atype, adata);
adata.SetVarchar('123');
adata.SetVarchar('abcd', true);
adata.EndCreate;
ret := adata.GetCollection(arr);
FOR i IN 1..arr.count LOOP
DBMS_OUTPUT.PUT_LINE(arr(i));
END LOOP;
END;
/
--result
123
abcd
--example 2
DECLARE
atype anytype;
adata anydata;
ret INT;
num NUMBER;
vc VARCHAR(100);
BEGIN
anytype.BeginCreate(DBMS_TYPES.TYPECODE_OBJECT, atype);
atype.AddAttr('A', DBMS_TYPES.TYPECODE_NUMBER, 100, 3, null, null, null);
atype.AddAttr('B', DBMS_TYPES.TYPECODE_VARCHAR, 0, 0, 1, null, null);
atype.EndCreate;
anydata.BeginCreate(atype, adata);
adata.SetNumber('123');
adata.SetVarchar('AbCd');
adata.EndCreate;
adata.piecewise;
ret := adata.GetNumber(num);
ret := adata.GetVarchar(vc);
DBMS_OUTPUT.PUT_LINE(num);
DBMS_OUTPUT.PUT_LINE(vc);
END;
/
--result
123
A

