plpgsql系列教程—函数




  • 函数声明

    通过执行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;

    示例结果:

    小刘先森为作者名字

    别名函数参数

    创建函数时为参数给定一个名称(推荐)

    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)

    刘航,国信司南(北京)地理信息技术有限公司,技术经理。负责过多个基于 PostgreSQL 数据库以及 PostGIS 的大中型项目。公司矢量切片产品(基于 PostgreSQL 数据库)研发核心人员。

    Speak Your Mind

    *