《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL用SQL做数据分析(3) https://developer.aliyun.com/article/1232909?groupCode=polardbforpg
3、用户定义函数
我们知道,数据导进来之后,我们是可以通过UPDATE更新值的,所以在COPY命令导入数据后,我们可以执行4UPDATE命令,把4个特征中的NULL值依次更新成0。但每次导数据都要执行4条语句很麻烦,有没有办法可以一次性执行4条UPDATE呢?
这里就用到了PolarDB一个非常重要的功能——用户定义的函数(UDF,User Defined Function)。PolarDB的UDF非常强大,大家甚至可以把他看成是一种FaaS(Function as a Service),它允许我们用很多种不同的编程语言来写函数,在无须重启数据库、更不用重新编译数据库内核的情况下,能直接使用动态创建的函数。函数的定义用CREATE FUNCTION,详细用法大家可以参考文档。
上图中用PLPGSQL这门语言创建了一个叫update_null_to_zero的函数。其中PLPGSQL是PolarDB自带的一种编程语言,此外还支持用SQL、Python等其他主流编程语言。update_null_to_zero这个函数没有返回值,所以returns是void,
函数体里除了开头的begin和结尾的end,就是4句更新语句。
4、后置触发器
函数定义完之后,调用函数的方法也非常简单,就是函数前面加上select就行。但又有另一个问题,每次导入数据后,都要记得手工执行一下这个填充缺失值的函数,有没有办法在每次数据导入后,都能自动地执行这个函数呢?
答案肯定的!PolarDB支持触发器功能,能在数据发生变更前或者变更后,自动运行某个函数。这正好符合我们期望的场
景。触发器的定义用CREATE TRIGGER命令,细节大家可以查看文档。
如上图所示,一个UDF要能被触发器调用,需要做一些简单的调整:1)返回结果不能是void,而需要改成TRIGGER;2)
在end之前,return一个null。然后用create trigger命令创建后置触发器,在每条插入flowers表的语句执行完之后,自动调用update_null_to_zero函数。
接下来我们演示一下。首先创建UDF:update_null_to_zero()。
创建好了之后,先手工调用一下,测试函数功能正常:
此时,原先是null的字段已经被更新成了0。接着,修改函数定义,变成触发器可调用的函数。
即返回类型是trigger,并且添加了return null语句,然后将其绑定到一个后置触发器上。
如上图所示,在清空表之后,用COPY重新导入,原先哪些导进来是空的数据自动变成了0,就说明触发器已经生效了!
5、过滤异常数据
除了前文提到的后置触发器(after trigger),触发器还有另外一种用法——前置触发器(before trigger)。顾名思义,后置触发器是在数据插入成功后执行,前置触发器是在数据插入之前执行。在前置触发器中,如果最终 return null 可以直接忽略该行数据;如果 return new,则能插入该行数据。因此,利用前置触发器,可以在数据被真正插入到数据库之前,过滤掉异常的数据。
例如上图所示,当鸢尾花的样本数据里四个特征全部是null,则认为是异常数据,可以直接忽略,看一下执行效果。
与后置触发器一样,也要先创建一个UDF作为触发器的handler:
接着将其绑定到前置触发器,然后再次清空表,并重新导入输入。
此时,只copy了150条数据,因为异常数据已经被自动被忽略。
《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL用SQL做数据分析(5) https://developer.aliyun.com/article/1232905?groupCode=polardbforpg