• PostgreSQL存储过程(4)-return语句


    1. return语句

    有三个命令可以用来从函数中返回数据:

    • RETURN
    • RETURN NEXT
    • RETURN QUERY

     2. RETURN命令

     语法:

    RETURN
    RETURN expression;

    如果没有使用表达式 RETURN命令用于告诉这个函数已经完成执行了。
    如果返回标量类型,那么可以使用任何表达式.要返回一个复合(行)数值,你必须写一个记录或者行变量的expression。

    2.1 案例1:带有表达式return案例

    CREATE OR REPLACE FUNCTION getCompFoo1
    (in_col1 int, in_col2 TEXT)
    RETURNS compfoo
    AS $$
    DECLARE 
        lottu compfoo;
    BEGIN
        lottu.col1 := in_col1 + 1;
        lottu.col2 := in_col2 || '_result';
        RETURN lottu;
    END;
    $$ LANGUAGE PLPGSQL;

      如果你声明函数带输出参数,那么就只需要写无表达式的RETURN。 那么输出参数变量的当前值将被返回。 

    CREATE OR REPLACE FUNCTION getCompFoo2
    (in_col1 IN int,in_col2 IN TEXT,
     out_col1 OUT int, out_col2 OUT TEXT)
    AS $$
    BEGIN
        out_col1 := in_col1 + 1;
        out_col2 := in_col2 || '_result';
    END;
    $$ LANGUAGE PLPGSQL;

    2.2 案例2:不带有表达式return案例

    如果你声明函数返回void,那么一个RETURN语句可以用于提前退出函数; 但是不要在RETURN后面写一个表达式。

    CREATE OR REPLACE FUNCTION getreturn(in_col1 int)
    RETURNS void
    AS $$
    BEGIN
        if in_col1 > 0 then
          RAISE NOTICE 'there is %',in_col1;
        else
          return;
        end if;
    END;
    $$ LANGUAGE PLPGSQL;

    3. RETURN NEXT命令

    语法:

    RETURN NEXT expression;

    3.1 RETURN NEXT命令

    可以用于标量和复合数据类型;对于复合类型,将返回一个完整的结果"table"。

    CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
    INSERT INTO foo VALUES (1, 2, 'three');
    INSERT INTO foo VALUES (4, 5, 'six');
    
    CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
    $$
    DECLARE
        r foo%rowtype;
    BEGIN
        FOR r IN SELECT * FROM foo WHERE fooid > 0
        LOOP
            -- can do some processing here
            RETURN NEXT r; -- return current row of SELECT
        END LOOP;
        RETURN;
    END
    $$ LANGUAGE PLPGSQL;

    4. RETURN QUERY命令

    语法:

    RETURN QUERY query;
    RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

    4.1 RETURN QUERY命令

      将一条查询的结果追加到一个函数的结果集中。

    CREATE OR REPLACE FUNCTION getAllFoo2() RETURNS SETOF foo AS
    $$
    DECLARE
        r foo%rowtype;
    BEGIN
        RETURN QUERY SELECT * FROM foo WHERE fooid > 0;
    END
    $$ LANGUAGE PLPGSQL;

    4.2 RETURN QUERY EXECUTE命令

    是执行动态SQL。

    CREATE OR REPLACE FUNCTION getAllFoo3(filter numeric) RETURNS SETOF foo AS
    $$
    BEGIN
        RETURN QUERY EXECUTE 'SELECT * FROM foo WHERE fooid > $1
    USING filter;
    ; END $$ LANGUAGE PLPGSQL;
  • 相关阅读:
    ATCoder code festival 2016 qual C
    2019.10.26模拟赛
    2019.10.24模拟赛
    狄利克雷卷积和莫比乌斯反演学习笔记
    ljq的互测の题解
    noi.ac #39
    noi.ac #741 code
    noi.ac #65 triangle
    让别人也可以访问你电脑上的ASP.NET MVC创建的网站
    ASP.NET MVC 开发中遇到的两个小问题
  • 原文地址:https://www.cnblogs.com/lottu/p/7410941.html
Copyright © 2020-2023  润新知