• 售前

  • 售后

热门帖子
入门百科

PostgreSQL 定义返回表函数的操纵

[复制链接]
杨小公子君莫邪 显示全部楼层 发表于 2021-10-26 14:05:45 |阅读模式 打印 上一主题 下一主题
本文我们学习如安在PostgreSQL 开发返回表函数。
示例数据表

我们利用的示例数据库表为film,如下图所示:

示例1

第一个函数发挥所有满意条件film表记录,这里利用ilike操纵,和like类似,但不区分巨细写:
  1. CREATE OR REPLACE FUNCTION get_film (p_pattern VARCHAR)
  2. RETURNS TABLE (
  3. film_title VARCHAR,
  4. film_release_year INT
  5. )
  6. AS $$
  7. BEGIN
  8. RETURN QUERY SELECT
  9. title,
  10. cast( release_year as integer)
  11. FROM
  12. film
  13. WHERE
  14. title ILIKE p_pattern ;
  15. END; $$
  16. LANGUAGE 'plpgsql';
复制代码
get_film(varchar) 函数接收一个参数,为匹配title字段的模式字符串。
为了从函数中返回表,需要利用return table语法,以及表的字段,每个字段利用逗号分隔。
在函数中,我们返回一个查询(select 语句)作为返回效果。留意select语句中的字段必须和返回表的字段范例一致。由于film表中release_year的数据范例不是integer,以是我们要利用cast函数转换成integer。
下面举行测试该函数:
  1. SELECT
  2. *
  3. FROM
  4. get_film ('Al%');
复制代码
我们调用该函数,获取所有title以Al开头的记录:

留意,我们也可以利用下面语句举行调用:
  1. SELECT
  2. get_film ('Al%');
复制代码
PostgreSQL 返回已一列数组形式返回表。

示例2

实际开发中,我们经常需要在返回函数效果集之前处理惩罚每一行记录。下面通过示例阐明:
  1. CREATE OR REPLACE FUNCTION get_film (p_pattern VARCHAR,p_year INT)
  2. RETURNS TABLE (
  3. film_title VARCHAR,
  4. film_release_year INT
  5. ) AS $$
  6. DECLARE
  7. var_r record;
  8. BEGIN
  9. FOR var_r IN(SELECT title, release_year
  10.    FROM film
  11.    WHERE title ILIKE p_pattern
  12.    AND release_year = p_year)
  13. LOOP
  14. film_title := upper(var_r.title) ;
  15. film_release_year := var_r.release_year;
  16. RETURN NEXT;
  17. END LOOP;
  18. END; $$
  19. LANGUAGE 'plpgsql';
复制代码
该函数与上一个名称一样get_film(varchar,int),但有两个参数:
第一个参数匹配title字段的模式字符串。仍旧利用ilike操纵实行搜索。
第二个参数是file的发行年度。
这两个函数在PostgreSQL中称为重载函数。我们想在返回效果之前处理惩罚每一行,利用 FOR LOOP语句举行处理惩罚。内部每个迭代中利用UPPER函数是film title 变为大写,仅为了演示而已。
return next语句是增长一行至函数效果会合,不断实行循环,在每次迭代中天生效果集。
下面举行测试:
  1. SELECT
  2. *
  3. FROM
  4. get_film ('%er', 2006);
复制代码
总结

如今你应该理解了如何开发返回表的函数,重要利用return query 和 return next 语句。
增补:Postgres自定义函数返回记录集(虚拟表结构)
看实例吧~
  1. CREATE OR REPLACE FUNCTION fun_get_real_inv_qty(pvOrderId varchar)
  2. RETURNS SETOF record AS
  3. $BODY$begin
  4. --drop table if exists tmp_1 ;
  5. --create temp table tmp_1 as
  6. return query
  7.         select fp_prod_id,fq_part_no,fq_name,
  8.         sum(case when fo_type='P' then -fp_qty          
  9.                  else 0
  10.           end
  11.         ) as purchase_qty,
  12.         sum(case when fo_type='S' then -fp_qty          
  13.                  else 0
  14.           end
  15.         ) as saleqty,
  16.         sum(case when fo_type='S' then -fp_qty
  17.                  when fo_type='P' then fp_qty
  18.                  else 0
  19.           end ) as surplus_qty from tp_send_det,to_send_note,tq_prod_mstr
  20.         where fp_order_id=pvOrderId and fo_note_id=fp_note_id and fq_prod_id=fp_prod_id and fq_type='I'
  21.         group by fp_prod_id,fq_part_no,fq_name ;
  22. end;$BODY$
  23. LANGUAGE plpgsql VOLATILE
  24. COST 100
  25. ROWS 10;
  26. ALTER FUNCTION fun_get_real_inv_qty()
  27. OWNER TO postgres;
复制代码
上面是例子,调用这个函数:
  1. select * from fun_get_real_inv_qty('D302') f(fp_prod_id bigint,fq_part_no varchar ,fq_name varchar ,purchase_qty numeric ,saleqty numeric ,surplus_qty numeric );
复制代码
f...背面带的是记录的column定义 必须与函数输出的列数目及每列数据范例逐一对应.
以上为个人履历,渴望能给各人一个参考,也渴望各人多多支持脚本之家。如有错误或未思量完全的地方,望不吝见教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作