文档章节

Postgresql UDF之返回集合的C语言函数(SRF)

Mortred_cp
 Mortred_cp
发布于 2015/12/04 17:31
字数 527
阅读 148
收藏 0

什么是SRF

SRFpostgres提供的一种api,可以用来编写c语言函数实现返回结果集的功能。用户执行一次函数,函数多次被调用,每次调用返回一行结果。


如何编写代码

编写SRF的函数,代码结构有固定的几处地方,如下:

#inlcude  “funcapi.h”
 
/*调用方式为v1*/
Datum  function_name(PG_FUNCTION_ARGS)
{
    /* Variable declaration
    …..
    …..
    
    /*这两个变量很重要,funcctx 维护函数调用期间的内存环境,
    初始化函数调用之前的内存并临时存储函数调用的结果;
    oldcontext 显而易见,记录函数调用时所在的内存上下文,
    每个涉及到内存上下文处理的函数都会用到*/   
    FuncCallContext *funcctx;
    MemoryContext oldcontext;/

 
    if(SRF_IS_FISRTCALL())  //判断该函数是否是第一次调用,前面说过每次调用都返回一行 
    { 
        funcctx = SRF_FIRSTCALL_INIT();   //第一次调用,需要申请一段内存用来存放函数多次调用的状态信息
                                          //以及每次调用返回的结果。

 
        oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
        /**
            用户代码...... 
        **/
        MemoryContextSwitchTo(oldcontext); //切换回程序运行环境
    } 
 
 
 
    /*获取第一次调用时申请的内存,因为这个内存在函数的多次调用期间一直存在,
      所以如果存储上次函数调用结果的内存有内容,会被清空以存储该次调用返回的结果。*/
    funcctx  = SRF_PERCALL_SERUP();     

    
    while(/*satisfy the conditions*/)
    {
        /*
        用户代码
        get or construct the result
        */

 
        SRF_RETURN_NEXT(funcctx,result);  //返回结果,并进行下一次函数调用
    }
    
    
    SRF_RETURN_DONE(funcctx); // 清除第一次调用申请的内存。
}


阅读SRF相关操作的源码宏定义,有个一直困扰我的问题,postgres源代码里面fcinfo到底是怎么实现的。。。

© 著作权归作者所有

Mortred_cp
粉丝 4
博文 1
码字总数 527
作品 0
程序员
私信 提问
PostgreSQL SRF (set-returning functions) 函数where, index实现

标签 PostgreSQL , set-returning functions , SRF , 索引 , 转换 背景 PostgreSQL 函数支持返回多行,定义returns setof type即可。PG内部也内置了蛮多这样的函数,例如 自定义SRF方法如下:...

德哥
2018/10/05
0
0
PostgreSQL Oracle 兼容性之 - create type

标签 PostgreSQL , Oracle , create type , method , constructor , table type , composite type , domain , enum , range , operator , index , udf 背景 Oracle 自定义类型与PostgreSQL自......

德哥
2018/05/06
0
0
Greenplum支持人为多阶段聚合的方法 - 直连segment(PGOPTIONS='-c gp_session_role=utility') Or gp_dist_random('gp_id') Or 多阶段聚合 prefunc

标签 PostgreSQL , 多阶段聚合 , 直连segment , gpdistrandom('gp_id') 背景 聚合操作是分析型场景中最常见的需求之一,在Greenplum中,数据已分布存储,聚合操作需要多阶段执行。 实际上Pos...

德哥
2018/10/05
0
0
PostgreSQL 11 preview - 通用场景性能 增强 汇总

标签 PostgreSQL , 通用场景性能 , 增强 , 11 背景 PostgreSQL 11 通用场景性能增强。 E.1.3.1.5. General Performance Add Just-In-Time (JIT) compilation of some parts of query plans t......

德哥
2018/07/28
0
0
科普一种可以将PG变成通用SQL引擎的技术

作者介绍 伊翼,网名“小wing”,野生PG爱好者,从事数据库相关工作已近十年,目前供职于全球最大的通讯设备供应商。 原标题:《当FDW遇上GO》 FDW(Foreign Data Wrapper)是PostgreSQL(下...

伊翼
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据教程分享Scala系列之模式匹配和样例类

好程序员大数据教程分享Scala系列之模式匹配和样例类 1.样例类 在Scala中样例类是一中特殊的类,样例类是不可变的, 可以通过值进行比较,可用于模式匹配。 定义一个样例类: 构造器中每一个...

好程序员官网
17分钟前
3
0
让nginx上的静态网页在访问的时候没有html后缀

需求背景: 公司产品小姐姐觉得这个访问带html后缀不专业,要求访问不带html后缀 nginx 配置 #原配置 location / { index index.html index.htm index.php; try_files $...

Linux_Anna
18分钟前
3
0
beetl的内置函数

函数调用Beetl内置函数请参考附录,以下列出了常用的函数date 返回一个java.util.Date类型的变量,如 date() 返回一个当前时间(对应java的java.util.Date); ${date( "2011-1-1" , "yy...

gantaos
19分钟前
3
0
spring cloud 2.x版本 Gateway自定义过滤器教程

前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 [toc] 本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon、eureka-feign和spring-gataway的实现。 参考......

毛毛向前冲V5
22分钟前
3
0
VPGAME 的 Kubernetes 迁移实践

作者 | 伍冲斌 VPGAME 运维开发工程师 导读:VPGAME 是集赛事运营、媒体资讯、大数据分析、玩家社群、游戏周边等为一体的综合电竞服务平台。总部位于中国杭州,在上海和美国西雅图分别设立了...

阿里巴巴云原生
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部