-
概述
RETURN语句一共有三个命令可以用来从函数中返回数据:
- RETURN
- RETURN NEXT
- RETURN QUERY
-
RETURN命令
语法:
RETURN
RETURN expression;
如果没有使用表达式 RETURN命令用于告诉这个函数已经完成执行了。
如果返回标量类型,那么可以使用任何表达式.要返回一个复合(行)数值,你必须写一个记录或者行变量的expression。
示例1: 带有表达式return
CREATE OR REPLACE FUNCTION getCompFoo1
(in_col1 int, in_col2 TEXT)
RETURNS compfoo
AS $$
DECLARE
comp compfoo;
BEGIN
comp.col1 := in_col1 + 1;
comp.col2 := in_col2 || '_result';
RETURN comp;
END;
$$ LANGUAGE PLPGSQL;
//compfoo 为自定义类型:
CREATE TYPE compfoo AS (f1 int, f2 text);
如果声明函数带输出参数,那么就只需要写无表达式的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:不带有表达式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;
-
RETURN NEXT 命令
语法:
RETURN NEXT expression;
可以用于标量和复合数据类型;对于复合类型,将返回一个完整的结果"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;
-
RETURN QUERY 命令
语法:
RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];
示例1:将一条查询的结果追加到一个函数的结果集中。
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;
示例2:执行动态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;