postgresql 多行变一行,C语言自定义函数
来源:互联网 发布:linux nexus 启动 编辑:程序博客网 时间:2024/05/16 06:05
函数效果如下:
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
- postgresql 多行变一行,C语言自定义函数
- 使用C语言写PostgreSQL函数
- PostgreSQL 多行变一行
- c语言自定义函数大全
- C语言中自定义函数
- 74 C语言自定义函数
- C语言:自定义字符串函数
- C语言自定义函数细节
- postgreSql自定义函数
- postgreSQL 自定义array_accum函数
- postgresql 查询结果 多行变一行
- C语言:自定义函数/字符串函数
- postgresql 创建 uuid 自定义函数
- C语言:自定义格式时间函数
- DB2自定义函数(C语言)实战
- DB2自定义函数(C语言)
- 自定义的delay()函数(C语言)
- C语言实现自定义多参数函数
- 无聊周末
- 查找元素问题
- 稀疏矩阵相加(十字链表实现)
- [原创]解决Unicode的乱码问题
- Linux下Rtl8139too网卡设备驱动程序关键函数剖析
- postgresql 多行变一行,C语言自定义函数
- poj 2057 树形dp ,特别考思路的好题。
- 十字链表存储表示随机稀疏矩阵
- jsp数据库池连接的详细解析(mysql为例)
- 软件开发方法论概述
- Sonic R-Basic knowledge finishing
- 论中西方文化之间的差异
- poj 1191 普通dp
- 消息称谷歌明年将推流媒体电影服务