#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
pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流