金仓数据库KingbaseES PLSQL中的伪类型–多态类型

关键字:

KingbaseES、伪类型、多态类型;人大金仓;KingbaseES

伪类型的概念

在KingbaseES类型系统中,提供了一些用于特殊目的的类型,它们被统称为伪类型。伪类型不能作为一个表中列的数据类型,但在PLSQL中,可以使用伪类型来定义一个函数的参数或者结果类型。下表列出了一些可以在PLSQL中使用的伪类型:

名字

描述

anyelement

表示一个函数可以接受任意数据类型

anyarray

表示一个函数可以接受任意数组数据类型

anynonarray

表示一个函数可以接受任意非数组数据类型

anyenum

表示一个函数可以接受任意枚举数据类型

anyset

表示一个函数可以接受任意 SET 数据类型

anyrange

表示一个函数可以接受任意范围数据类型

record

标识一个接收或者返回一个未指定的行类型的函数。

trigger

一个被声明为返回 trigger 的触发器函数。

event_trigger

一个被声明为返回 event_trigger 的事件触发器函数。

void

表示一个函数没有返回值。

其中,void、record、trigger、event_trigger可以作为函数的结果类型。此外,nyelement、anyarray 、anynoarray、anyenum和anyrange这5种伪类型也被称为多态类型,在PLSQL中, 它们既可以作为函数的参数类型,表示可以接收不同数据类型的参数;也可以作为函数的结果类型,以返回多种数据类型的结果。

多态类型的应用

可以使用多态类型定义多态函数。任何使用多态类型声明的函数被称为多态函数,也就是说多态函数可以接收多态参数或返回多种结果。因此,在某些情况下,可以编写多态函数来处理不同数据类型的参数,而不需要为每种可能的数据类型编写单独的函数。下面为一个多态函数的示例:

CREATE FUNCTION f1 (i anyelement) RETURN anyelement AS

BEGIN

return i;

END;

/

该函数可以接收任何类型的参数,然后返回这个参数。下面,调用这个多态函数:

DECLARE

a number := 123;

b varchar2(20) := ‘abc’;

c DATE := SYSDATE;

d INT[] := ARRAY [1,3,5];

BEGIN

RAISE NOTICE ‘a = %’, f1(a); –接收number类型的参数

RAISE NOTICE ‘b = %’, f1(b); –接收VARCHAR2类型的参数

RAISE NOTICE ‘c = %’, f1(c); –接收date类型的参数

RAISE NOTICE ‘d = %’, f1(d); –接收数组类型的参数

END;

/

结果如下:

由此可见,多态函数具有非常大的灵活性,其能够根据调用时所传递的参数类型,来适应不同的情况,并执行相应的操作。

anynoarray和anyenum的使用限制

需要注意的是,anynoarray和anyenum不用于表示独立的类型变量,它们与anyelement类型相同,但有一个额外的限制条件,所有实际参数必须具有相同的数据类型。例如,当一个函数的声明如下时:

FUNCTION func2 (anyelement, anyenum) RETURN INT;

等效于

FUNCTION func2 (anyenum, anyenum) RETURN INT;

也就是说,只要有一个参数或返回结果被声明为anyenum类型,那么所有anyelement和anyenum类型的实际参数,必须具有相同的枚举类型。如下为一个简单示例:

–创建两个枚举类型

CREATE TYPE sessions AS ENUM (‘spring’,’summer’,’autumn’,’winter’);

CREATE TYPE days AS ENUM (‘0′,’1′,’2′,’3′,’4′,’5′,’6’);

–创建包含anyelement和anyenum参数的多态函数

CREATE FUNCTION func3 (j anyelement, k anyenum) RETURN anyelement AS

BEGIN

return j;

END;

/

对于函数func3,除了第一个参数以外,其余所有的参数都必须具有相同的枚举类型。因此,可以对其进行如下调用:

DECLARE

a sessions := ‘summer’;

b sessions := ‘winter’;

i days := ‘2’;

j days := ‘3’;

BEGIN

raise notice ‘%’, f123(a,b);

raise notice ‘%’, f123(i,j);

END;

/

结果如下:

当两个参数具有不同的枚举类型,或为其他类型是,则会报错。示例如下:

DECLARE

a sessions := ‘summer’;

b days := ‘6’;

BEGIN

raise notice ‘%’, f123(a,b);

END;

/

到目前为止,我们主要介绍了多态函数的用法。然而,存储过程除了没有返回值以外,同样可以通过声明多态参数来定义一个多态的存储过程,其使用方法与多态函数基本一致。

总结

使用多态类型定义参数或结果类型,我们可以编写根据通用型的代码。因此,当您需要编写能够处理不同数据类型的函数时,可以在PLSQL中使用多态类型来定义该函数,以灵活应对多种类型数据类型的需求。

参考资料

《KingbaseES_PLSQL过程语言参考手册》