PostgreSQL函数(存储过程)返回多条记录的实现方式
程序员文章站
2024-03-21 11:26:28
...
PostgreSQL函数(存储过程)返回多条记录的实现方式
背景: 利用pg提供的函数,返回多条记录进行表格渲染
方式一: 利用循环
CREATE
OR REPLACE FUNCTION "public"."f_get_traindata" ( OUT "o_item" VARCHAR, OUT "o_periodsnum" VARCHAR, OUT "o_trainday" VARCHAR, OUT "o_attendpersonnum" VARCHAR ) RETURNS SETOF "pg_catalog"."record" AS $BODY$ DECLARE
rec record; -- 定义返回记录行
o_sql TEXT; -- 定义执行的sql片段
BEGIN
o_sql := 'SELECT item,periodsnum,trainday,attendpersonnum FROM bi_fact_traindata;';
-- 输出字段
FOR rec IN EXECUTE o_sql
loop
-- 将每个字段一一赋值给变量
o_item := rec.item;
o_periodsnum := rec.periodsnum;
o_trainday := rec.trainday;
o_attendpersonnum := rec.attendpersonnum;
RETURN NEXT;
END loop;
RETURN;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000
这种方式比较麻烦,需要一一定义字段,比较繁琐。
方式二: 使用table
利用table
CREATE OR REPLACE FUNCTION "public"."f_get_appraisalindex" ( "o_indexid" VARCHAR )
-- 定义table
RETURNS TABLE (
"o_indexname" VARCHAR,
"o_standardrule" VARCHAR,
"o_standardscore" VARCHAR,
"o_losescore" NUMERIC,
"o_orgstructname" VARCHAR,
"o_appraisaldate" VARCHAR,
"o_periodictime" VARCHAR,
"o_periodictimelosescore" NUMERIC,
"o_evaluatereason" VARCHAR
) AS $BODY$
BEGIN
RETURN query
-- 字段一一映射
SELECT
tn_indexname,
tn_standardrule,
tn_standardscore,
tn_losescore,
tn_orgstructname,
tn_appraisaldate,
tn_periodictime,
tn_periodictimelosescore,
tn_evaluatereason
FROM
tn_appraisalindex
WHERE
tn_periodictimelosescore > 0
ORDER BY
tn_indexid;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000
扩展
如何定义有入参和出参的情况:可以不需要明确指出return的方式
(图片来源:https://blog.csdn.net/qq_42535651/article/details/92089510)
上一篇: 仿Apple官网CSS样式实现