定义一个可输出数据集自定义函数有多种方法
1,先定义结构,再使用结构输出结果
CREATE TYPE compfoo AS (f1 int, f2 text); CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$ SELECT fooid, fooname FROM foo $$ LANGUAGE SQL;
2,直接在return中定义表结构
CREATE FUNCTION sum_n_product_with_tab (x int) RETURNS TABLE(sum int, product int) AS $$ SELECT $1 + tab.y, $1 * tab.y FROM tab; $$ LANGUAGE SQL;
3,return定义为record,在定义输出参数
CREATE FUNCTION sum_n_product_with_tab (x int, OUT sum int, OUT product int) RETURNS SETOF record AS $$ SELECT $1 + tab.y, $1 * tab.y FROM tab; $$ LANGUAGE SQL;
主要为以上三种基础情况,再说下基于以上的高频的写法。
基于逻辑需要,表结构需要拼接字符串,这时函数内的数据集是使用 execute 获取的,直接使用execute runsql; 是不能通过调用函数获取最后的结果的。可以这么玩。
CREATE TYPE compfoo AS (f1 int, f2 text); create function func1(x int4) returns setof compfoo as $BODY$ declare row_index compfoo ; declare runstr text; ..... begin .... for row_index in execute runstr loop return next row_index; end loop; end $BODY$
来解读下,先定义输出结构。在函数内使用 for in 循环输出结果。这样才能将通过调用函数返回结果。
注:变量 row_index 需要在 declare 声明变量时定义,不然会报“ for 附近有异常”的错误。
转载注明出处:https://www.cnblogs.com/jackicalSong/
以下截图为以上逻辑写出的来的。。
方便他人,成就自己!