金仓数据库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过程语言参考手册》