博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
postgresql 多行变一行,C语言自定义函数
阅读量:4031 次
发布时间:2019-05-24

本文共 2516 字,大约阅读时间需要 8 分钟。

 

函数效果如下:

select * from cxf limit 10;id----------abcdefghij(10 row)mysql=# select STRCAT2(id,'|') from (select * from cxf limit 10) t;                                         strcat2                                         ----------------------------------------------------------------------------------------- a|b|c|d|e|f|g|h|i|j(1 row)

 

创建聚集函数的子函数:

 

drop FUNCTION strcat2_sfunc(varchar, varchar,varchar);CREATE FUNCTION strcat2_sfunc(varchar, varchar,varchar)RETURNS varchar AS '/home/mysql/cxf/postgresql-8.2.16/contrib/strcat/libstrcat2_sfunc'LANGUAGE C IMMUTABLE;

创建聚集函数

drop AGGREGATE PUBLIC.STRCAT2(VARCHAR,varchar);CREATE  AGGREGATE PUBLIC.STRCAT2(VARCHAR,varchar)(  SFUNC=strcat2_sfunc,   STYPE=VARCHAR  );

 

子函数源码如下:

strcat2_sfunc.c#include "postgres.h"#include "funcapi.h"#include "fmgr.h"#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endifPG_FUNCTION_INFO_V1(strcat2_sfunc);Datumstrcat2_sfunc(PG_FUNCTION_ARGS){                VarChar  *arg1;                VarChar  *arg2;                VarChar  *arg3;                if(PG_ARGISNULL(0) && PG_ARGISNULL(1))                {                         PG_RETURN_NULL();                }                else if(PG_ARGISNULL(0)){                                PG_RETURN_VARCHAR_P(PG_GETARG_VARCHAR_P(1));                }                else if(PG_ARGISNULL(1))                {                                PG_RETURN_VARCHAR_P(PG_GETARG_VARCHAR_P(0));                }                else{            arg1 = PG_GETARG_VARCHAR_P(0);            arg2 = PG_GETARG_VARCHAR_P(1);            arg3 = PG_GETARG_VARCHAR_P(2);             int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) +VARSIZE(arg3)- VARHDRSZ*2;            VarChar *new_text = (VarChar *) palloc(new_text_size);             VARATT_SIZEP(new_text) = new_text_size;            memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);            memcpy(VARDATA(new_text) + (VARSIZE(arg1) - VARHDRSZ), VARDATA(arg3), VARSIZE(arg3) - VARHDRSZ);            memcpy(VARDATA(new_text) + (VARSIZE(arg1)+VARSIZE(arg3) - VARHDRSZ*2),                  VARDATA(arg2), VARSIZE(arg2)- VARHDRSZ);            PG_RETURN_VARCHAR_P(new_text);  }}

 Makefile:

 

## Makefile for building PostgreSQL extension modules#MODULE_big = strcat2_sfuncOBJS = strcat2_sfunc.oDATA = DOCS = REGRESS = ifdef USE_PGXSPG_CONFIG = pg_configPGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS)elsesubdir = contrib/statfunctop_builddir = ../..include $(top_builddir)/src/Makefile.globalinclude $(top_srcdir)/contrib/contrib-global.mkendif

 

 

转载地址:http://peebi.baihongyu.com/

你可能感兴趣的文章
@RequestParam、@QueryParam等Spring常见参数注解区别,你知道吗
查看>>
玩转远程Debug,两步轻松开启IDEA远程调试
查看>>
Jmeter压测错误,Address already in use: connect
查看>>
Intellij IDEA常用快捷键,最全总结
查看>>
前端干货,超实用的JQuery小技巧
查看>>
Spring Boot 几个常见的核心注解
查看>>
程序员需要懂的一些Linux基本命令
查看>>
程序员需要掌握的一些网络协议汇总
查看>>
搞定Windows下的Hadoop环境安装
查看>>
设计模式之单例模式的五种写法
查看>>
Nginx开启Gzip压缩,使你的网页急速加载
查看>>
一文看清HBase的使用场景
查看>>
除了负载均衡,Nginx还可以做很多,限流、缓存、黑白名单
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
深入理解Apache Flink核心技术
查看>>
SpringCloud 各组件原理图,面试必备
查看>>
面试题总结:可能是全网最好的MySQL重要知识点
查看>>
MySQL面试之数据库索引
查看>>
完整的项目管理流程,看清PMP42个过程的执行顺序
查看>>