plpgsql系列教程(3)-函数

本文由 @小刘先森 原创,转载请注明出处。

PL/pgSQL系列文章,方便小伙伴们学习。

PL/pgSQL从入门到放弃(1)-入门
PL/pgSQL从入门到放弃(2)-变量定义与数据类型
PL/pgSQL从入门到放弃(3)-函数
PL/pgSQL从入门到放弃(4.1)-函数返回常用数据类型——组合数据类型
PL/pgSQL从入门到放弃(4.2)-函数返回常用数据类型——行数据类型
PL/pgSQL从入门到放弃(4.3)-函数返回常用数据类型——记录数据类型
PL/pgSQL从入门到放弃(4.4)-函数返回常用数据类型——复制数据类型
PL/pgSQL从入门到放弃(5)-条件语句与循环语句
PL/pgSQL从入门到放弃(6)-游标

函数声明

通过执行CREATE FUNCTION命令,以PL/pgSQL写成的函数可以被定义到服务器中。

CREATE or REPLACE FUNCTION somefunc(integer, text) RETURNS integer
AS 'function body text'
LANGUAGE plpgsql;

PL/pgSQL是一种块结构的语言。一个块被定义为:

[ <<label>> ]
[ DECLARE
    declarations 
BEGIN
    statements
END [ label ];

目前CREATE FUNCTION函数体就是简单的一个字符串。通常在写函数体时,使用美元符号引用通常比使用普通单引号语法更有帮助。如果没有美元引用,函数体中的任何单引号或者反斜线必须通过双写来转义。
推荐写法如下:

CREATE FUNCTION somefunc(integer, text) RETURNS integer AS $$
DECLARE
BEGIN
END;
$$ LANGUAGE plpgsql;

函数参数

声明函数参数被命名为标识符$1、$2等等。可选地,能够为$n参数名声明别名来增加可读性。不管是别名还是数字标识符都能用来引用参数值。

数字标识函数参数

CREATE FUNCTION hello(varchar) RETURNS varchar AS $$
DECLARE
BEGIN
    RETURN  '你好,' || $1;
END;
$$ LANGUAGE plpgsql;

示例结果:
小刘先森为作者名字
hello结果

别名函数参数

  • 创建函数时为参数给定一个名称推荐
CREATE FUNCTION hello(name varchar) RETURNS varchar AS $$
DECLARE
BEGIN
    RETURN  '你好,' || name ;
END;
$$ LANGUAGE plpgsql;
  • 显式地使用声明语法声明一个别名
CREATE FUNCTION hello(varchar) RETURNS varchar AS $$
DECLARE
    name ALIAS FOR $1;
BEGIN
    RETURN  '你好,' || name ;
END;
$$ LANGUAGE plpgsql;

函数返回

  • returns返回
    示例函数就使用returns返回了一个varchar类型的值。
CREATE FUNCTION hello(name varchar) RETURNS varchar AS $$
DECLARE
BEGIN
    RETURN  '你好,' || name ;
END;
$$ LANGUAGE plpgsql;
  • 输出参数返回
    输出参数在返回多个值时很有用。在定义函数时使用OUT关键字标识返回参数。示例如下:
CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
BEGIN
    sum := x + y;
    prod := x * y;
END;
$$ LANGUAGE plpgsql;

输出结果如下:
输出结果
示例函数的结果实际上创建了一个匿名记录类型。如果使用RETURNS返回,它必须是RETURNS record。使用RETURNS record返回写法如下:

CREATE or replace FUNCTION sum_n_product(x int, y int) returns record AS $$
DECLARE
	r_data record;
	sum int;
	prod int;
BEGIN
    sum := x + y;
    prod := x * y;
	r_data = (sum , prod );
	return r_data;
END;
$$ LANGUAGE plpgsql;

输出结果如下:
直接返回按照记录方式返回结果

关于作者

大家有需要介绍哪些部分,或者一些想法欢迎联系我。

GISer
QQ: 1016817543
邮箱:1016817543@qq.com
github:https://github.com/MrSmallLiu (欢迎star)

相关链接

欢迎各位Star、Issues、PR

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值