ANYDATA类型

ANYTYPE、ANYDATA 和 ANYDATASET 是用于处理不确定数据类型的一组类型,包含类型的实际数据,以及对该类型的描述,可以用于动态地处理各种数据类型。

规格描述

  1. ANYTYPE、ANYDATA 和 ANYDATASET 类型可处理的普通数据类型范围限定在binary_double、blob、char、date、nchar、number、nvarchar2、raw、timestamp、timestamptz、varchar、varchar2,共12种类型内。
  2. 对于以上12种对应类型的CONVERT方法构建的ANYDATA、ANYDATASET,类型描述部分即ANYTYPE属性为NULL,详见下述GETTYPE存储过程。
  3. 三种类型均创建于public shcema下,类型所包含的存储过程需通过类型名.存储过程名进行调用,包含self参数的存储过程也可通过对象名.存储过程名的方式调用,仅有self参数的存储过程使用时不可省略括号。使用方式与面向对象语法类似,详见下述对应类型的SQL语句示例。

ANYTYPE

ANYTYPE类型可存储其他类型的类型描述,如类型名、数值类型的精度、字符串类型的长度等。

存储过程

BEGINCREATE

STATIC PROCEDURE BEGINCREATE(
   typecode       IN          INTEGER,
   atype          OUT         ANYTYPE);

创建一个新的 ANYTYPE 实例,用于创建类型描述。

参数类型说明
typecodeint入参,整数代表对应类型
atypeanytype出参,初始化的anytype

这里给出以上12种类型对应的typecode

typecode类型
101binary_double
113blob
96char
12date
286nchar
2number
287nvarchar2
95raw
187timestamp
188timestamptz
1varchar
9varchar2

SETINFO

MEMBER PROCEDURE SETINFO(
   self          IN OUT NOCOPY ANYTYPE,
   prec          IN INTEGER,
   scale         IN INTEGER,
   len           IN INTEGER,
   csid          IN INTEGER,
   csfrm         IN INTEGER,
   atype         IN ANYTYPE DEFAULT NULL,
   elem_tc       IN INTEGER DEFAULT NULL,
   elem_count    IN INTEGER DEFAULT 0);

设置ANTYPE的各属性。

参数类型说明
selfANYTYPEself
precint数字类型精度
scaleint数字类型刻度,与精度一起使用
lenint字符串类型长度
csidint字符集id
csfrmint字符格式
atypeANYTYPEobject类型入参,未使用
elem_tcintcollection类型的typecode,未使用
elem_countinttable或数组类型的长度,未使用

ENDCREATE

MEMBER PROCEDURE ENDCREATE(
   self           IN OUT NOCOPY ANYTYPE);

结束创建一个ANYTYPE。在此调用后,其他SET函数不能被调用。

参数类型说明
selfANYTYPEself

GETINFO

MEMBER FUNCTION GETINFO (
   self        IN ANYTYPE,
   prec        OUT INTEGER, 
   scale       OUT INTEGER,
   len         OUT INTEGER, 
   csid        OUT INTEGER,
   csfrm       OUT INTEGER,
   schema_name OUT VARCHAR2, 
   type_name   OUT VARCHAR2, 
   version     OUT varchar2,
   numelems    OUT INTEGER)
   RETURN      INTEGER;

获取ANYTYPE类型中的属性值,需要在ENDCREATE后调用。

参数类型说明
selfANYTYPEself
precint数字类型精度
scaleint数字类型刻度,与精度一起使用
lenint字符串类型长度
csidint字符集id
csfrmint字符格式
schema_namevarchar类型所在schema
type_namevarchar类型名
versionvarchar类型的版本
numelemsint数组类型的元素数量,object类型的属性数量

返回值:type_name对应的typecode

示例

declare
   v_anytype    anytype;
   prec         int;
   scale        int;
   len          int; 
   csid         int;
   csfrm        int;
   schema_name  VARCHAR2(20); 
   type_name    VARCHAR2(20); 
   version      varchar2(20);
   numelems     int;
   result       int;
begin
    anytype.BeginCreate(101, v_anytype);
    v_anytype.setinfo(255, 127, 2147483647, 65535, 33);
	anytype.endcreate(v_anytype);
    result := v_anytype.getinfo(prec,scale,len,csid,csfrm,schema_name,type_name,version,numelems);
    RAISE NOTICE 'Output values are: %, %, %, %, %, %', prec, scale, len, csid, csfrm, schema_name;
	RAISE NOTICE 'More output values are: %, %, %, %', type_name, version, numelems, result;
end;
/
NOTICE:  Output values are: <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>
NOTICE:  More output values are: <NULL>, <NULL>, <NULL>, 101
ANONYMOUS BLOCK EXECUTE

ANYDATA

ANYDATA用于处理不确定类型数据,包含类型的实际数据,以及对该类型的描述。其类型描述部分可以看作一个ANYTYPE。

存储过程

CONVERT

STATIC FUNCTION ConvertBDouble(dbl IN BINARY_DOUBLE) return ANYDATA;
STATIC FUNCTION ConvertBlob(b IN BLOB) RETURN ANYDATA;
STATIC FUNCTION ConvertChar(c IN CHAR) RETURN ANYDATA;
STATIC FUNCTION ConvertDate(dat IN DATE) RETURN ANYDATA;
STATIC FUNCTION ConvertNchar(nc IN NCHAR) return ANYDATA;
STATIC FUNCTION ConvertNVarchar2(nc IN NVARCHAR2) return ANYDATA;
STATIC FUNCTION ConvertNumber(num IN NUMBER) RETURN ANYDATA;
STATIC FUNCTION ConvertRaw(r IN RAW) RETURN ANYDATA;
STATIC FUNCTION ConvertTimestamp(ts IN TIMESTAMP) return ANYDATA;
STATIC FUNCTION ConvertTimestampTZ(ts IN TIMESTAMP WITH TIMEZONE) return ANYDATA;
STATIC FUNCTION ConvertVarchar(c IN VARCHAR) RETURN ANYDATA;
STATIC FUNCTION ConvertVarchar2(c IN VARCHAR2) RETURN ANYDATA;

创建一个新的ANYDATA实例。对于以上12种CONVERT方法构建的ANYDATA,类型描述部分即ANYTYPE属性为NULL。

参数类型说明
--12种类型对应的入参

返回值:ANYDATA

ACCESS

MEMBER FUNCTION AccessBDouble(self IN ANYDATA) return BINARY_DOUBLE;
MEMBER FUNCTION AccessBlob(self IN ANYDATA) return BLOB;
MEMBER FUNCTION AccessChar(self IN ANYDATA) return CHAR;
MEMBER FUNCTION AccessDate(self IN ANYDATA) return DATE;
MEMBER FUNCTION AccessNchar(self IN ANYDATA) return NCHAR;
MEMBER FUNCTION AccessNumber(self IN ANYDATA) return NUMBER;
MEMBER FUNCTION AccessNVarchar2(self IN ANYDATA) return NVARCHAR2;
MEMBER FUNCTION AccessRaw(self IN ANYDATA) return RAW;
MEMBER FUNCTION AccessTimestamp(self IN ANYDATA) return TIMESTAMP;
MEMBER FUNCTION AccessTimestampTZ(self IN ANYDATA) return TIMESTAMP WITH TIMEZONE;
MEMBER FUNCTION AccessVarchar(self IN ANYDATA) return VARCHAR;
MEMBER FUNCTION AccessVarchar2(self IN ANYDATA) return VARCHAR2;

返回ANYDATA中的数据。首先需要与ANYDATA中存储的数据类型匹配,若不匹配,返回NULL。

参数类型说明
selfANYDATAself

返回值:12种对应类型

GETTYPE

MEMBER FUNCTION GETTYPE(
   self          IN ANYDATA,
   typ           OUT NOCOPY AnyType)
   RETURN        INTEGER;

将ANYDATA的类型描述,即ANYTYPE部分赋给出参typ,并返回对应的类型的typecode。在限定的12种类型下,获取的typ均为NULL,typcode为实际类型。

参数类型说明
selfANYDATAself
typAnyType类型信息

返回值:类型对应的typecode

GETTYPENAME

MEMBER FUNCTION GETTYPENAME(
   self         IN ANYDATA)
   RETURN       VARCHAR2;

返回ANYDATA中存储的数据类型名称。

参数类型说明
selfANYDATAself

返回值:类型名

示例

declare
    v_anydata anydata;
    typecode int;
    v_char nchar(10);
    type_name    VARCHAR2(20);
begin
    v_anydata := anydata.convertnchar('abc123,?');
    v_char := v_anydata.accessnchar();
    typecode = v_anydata.gettype();
    type_name = v_anydata.gettypename();
    raise notice '%, %, %', v_char, type_name, typecode;
end;
/
NOTICE:  abc123,?  , NChar, 286
ANONYMOUS BLOCK EXECUTE

ANYDATASET

ANYDATASET用于处理一组不确定类型数据,可看作ANYDATA的集合,单个集合中的类型需要相同。

存储过程

BEGINCREATE

STATIC PROCEDURE BeginCreate(
   typecode     IN INTEGER,
   rtype        IN OUT NOCOPY AnyType,
   aset         OUT NOCOPY ANYDATASET);

函数接收typecode确定集合中元素的类型,创建一个新的ANYDATASET实例。此处的typecode对应关系与ANYTYPE相同。

参数类型说明
typecodeint集合类型的typecode
rtypeAnyType集合类型的类型属性
asetANYDATASET出参,初始化函数的返回值
typecode类型
101binary_double
113blob
96char
12date
286nchar
2number
287nvarchar2
95raw
187timestamp
188timestamptz
1varchar
9varchar2

ADDINSTANCE

MEMBER PROCEDURE AddInstance(
   self          IN OUT NOCOPY ANYDATASET);

在ANYDATASET中创建一个新的数据元素,每次新增元素时均需要调用该存储过程。

参数类型说明
selfANYDATASETself

SET

MEMBER PROCEDURE SETBDOUBLE(
   self              IN OUT NOCOPY ANYDATASET, 
   dbl               IN BINARY_DOUBLE, 
   last_elem         IN BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETBLOB(
   self              IN OUT NOCOPY ANYDATASET,
   b                 IN BLOB,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETCHAR(
   self              IN OUT NOCOPY ANYDATASET,
   c                 IN CHAR,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETDATE(
   self              IN OUT NOCOPY ANYDATASET,
   dat               IN DATE,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETNCHAR(
   self              IN OUT NOCOPY ANYDATASET,
   nc                IN NCHAR, 
   last_elem IN BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETNUMBER(
   self              IN OUT NOCOPY ANYDATASET,
   num               IN NUMBER,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETNVARCHAR2(
   self             IN OUT NOCOPY ANYDATASET,
   nc               IN NVarchar2, 
   last_elem        IN BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETRAW(
   self              IN OUT NOCOPY ANYDATASET,
   r                 IN RAW,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETTIMESTAMP(
   self              IN OUT NOCOPY ANYDATASET, 
   ts                IN TIMESTAMP,
   last_elem IN BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETTIMESTAMPTZ(
   self             IN OUT NOCOPY ANYDATASET, 
   ts               IN TIMESTAMP WITH TIME ZONE,
   last_elem        IN BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETVARCHAR(
   self              IN OUT NOCOPY ANYDATASET,
   c                 IN VARCHAR,
   last_elem BOOLEAN DEFAULT FALSE);

MEMBER PROCEDURE SETVARCHAR2(
   self              IN OUT NOCOPY ANYDATASET,
   c                 IN VARCHAR2,
   last_elem BOOLEAN DEFAULT FALSE);

为ANYDATASET中的单个数据元素实例设定值,在ADDINSTANSE后调用,需要和ANYDATASET创建时指定的类型一致。其他调用顺序将有以下表现:

  • 进行过ADDINSTANSE但未设定值,正常调用SET赋值
  • BEGINCREATE后未进行ADDINSTANSE,调用SET报错。
  • 前向数据实例均已设定值,此时调用SET,覆盖最后一个数据实例。
参数类型说明
selfANYDATASETself
--12种对应类型参数
last_elemBOOLEAN是否是集合类型的最后一个元素,未使用

ENDCREATE

MEMBER PROCEDURE ENDCREATE(
   self              IN OUT NOCOPY ANYDATASET);

结束ANYDATASET构建。ANYDATASET允许BEGINCREATE之后直接ENDCREATE,也就是空集。若有未设定值的元素,即ADDINSTANSE后未调用对应的SET,将报错。

参数类型说明
selfANYDATASETself

GET

MEMBER FUNCTION GETBDOUBLE(
   self        IN ANYDATASET, 
   index       IN int,
   dbl         OUT NOCOPY BINARY_DOUBLE)
 RETURN INTEGER;

MEMBER FUNCTION GETBLOB(
   self        IN ANYDATASET,
   index       IN int,
   b           OUT NOCOPY BLOB)
 RETURN      INTEGER;

MEMBER FUNCTION GETCHAR(
   self        IN ANYDATASET,
   index       IN int,
   c           OUT NOCOPY CHAR)
 RETURN INTEGER;

MEMBER FUNCTION GETDATE(
   self        IN ANYDATASET,
   index       IN int,
   dat         OUT NOCOPY DATE)
 RETURN INTEGER;

MEMBER FUNCTION GETNCHAR(
   self        IN ANYDATASET, 
   index       IN int,
   nc          OUT NOCOPY NCHAR)
 RETURN INTEGER;

MEMBER FUNCTION GETNUMBER(
   self        IN ANYDATASET,
   index       IN int,
   num         OUT NOCOPY NUMBER)
   RETURN INTEGER;

MEMBER FUNCTION GETNVARCHAR2(
   self        IN ANYDATASET, 
   index       IN int,
   nc          OUT NOCOPY NVARCHAR2)
 RETURN INTEGER;

MEMBER FUNCTION GETRAW(
   self        IN ANYDATASET,
   index       IN int,
   r           OUT NOCOPY RAW)
 RETURN INTEGER;

MEMBER FUNCTION GETTIMESTAMP(
   self        IN ANYDATASET, 
   index       IN int,
   ts          OUT NOCOPY TIMESTAMP)
 RETURN INTEGER;

MEMBER FUNCTION GETTIMESTAMPTZ(
   self        IN ANYDATASET, 
   index       IN int,
   ts          OUT NOCOPY TIMESTAMP WITH TIME ZONE) 
 RETURN INTEGER,

MEMBER FUNCTION GETVARCHAR(
   self        IN ANYDATASET,
   index       IN int,
   c           OUT NOCOPY VARCHAR)
 RETURN      INTEGER;

MEMBER FUNCTION GETVARCHAR2(
   self        IN ANYDATASET,
   index       IN int,
   c           OUT NOCOPY VARCHAR2)
 RETURN INTEGER;

根据index返回ANYDATASET中的元素

参数类型说明
selfANYDATASETself
indexint需要取的元素下标
----12种对应类型出参

返回值:SUCCESS(0)

GETCOUNT

MEMBER FUNCTION GetCount(
   self        IN ANYDATASET) 
 RETURN INTEGER;
参数类型说明
selfANYDATASETself

返回值:ANYDATASET中元素的个数

GETTYPE

MEMBER FUNCTION GETTYPE(
   self           IN ANYDATASET,
   typ            OUT NOCOPY AnyType)
RETURN INTEGER;

将ANYDATASET的类型描述,即ANYTYPE部分赋给出参typ,并返回对应的类型的typecode。在限定的12种类型下,获取的typ均为NULL,typcode为实际类型。

参数类型说明
selfANYDATAself
typAnyType类型信息

返回值:类型对应的typecode

GETTYPENAME

MEMBER FUNCTION GETTYPENAME(
   self         IN ANYDATASET)
   RETURN       VARCHAR2;

返回ANYDATA中存储的数据类型名称。

参数类型说明
selfANYDATAself

返回值:类型名

示例

declare
    v_anytype    anytype;
    v_anydataset anydataset;
    v_string float8;
    v_type int;
    v_typname varchar2;
    v_count int;
    v_typecode int;
begin
    anydataset.BeginCreate(1, v_anytype, v_anydataset);
    RAISE notice '%, %', array_length(v_anydataset.data, 1), v_anydataset.count;

    v_anydataset.addInstance();
    v_anydataset.SETvarchar('100.80');
    v_anydataset.addInstance();
    v_anydataset.SETvarchar('0.90');
    anydataset.EndCreate(v_anydataset);

    RAISE notice '%, %', array_length(v_anydataset.data, 1), v_anydataset.count;

    v_typname = v_anydataset.GetTypename();
    v_count = v_anydataset.GetCount();
    v_typecode = v_anydataset.GetType();

    RAISE notice 'name %, count %, type %', v_typname, v_count, v_typecode;
    
    v_type := v_anydataset.getvarchar(v_string,1);
    raise notice '%, %', v_string, v_type;
    v_type := v_anydataset.getvarchar(v_string,2);
    raise notice '%, %', v_string, v_type;
    v_type := v_anydataset.getvarchar(v_string,3);
    raise notice '%, %', v_string, v_type;  
end;
/
NOTICE:  0, 0
NOTICE:  2, 2
NOTICE:  name Varchar, count 2, type 1
NOTICE:  <NULL>, 0
NOTICE:  <NULL>, 0
NOTICE:  <NULL>, 0
ANONYMOUS BLOCK EXECUTE
意见反馈
编组 3备份
    openGauss 2025-04-24 08:40:47
    取消