我需要为mySQL 5.x编写一个聚合扩展函数(用C实现)。我浏览过文档(包括浏览sql/udf_example.c),但没有发现任何简短的内容,并指出了我需要做的事情。mysql中的聚合UDF(用户定义函数)C
这就是问题:
- 我有一个C结构(美孚)
我有一个C函数,它接受这些富结构的数组,执行操作,该阵列上,并且返回一倍。
struct FooBar {char * date; 双倍年龄; double wight; 双薪; int eye_color; };
/*处理功能/ 双processFooBars(结构FooBar的 foobars,常量为size_t大小);
/* MySQL表*/ CREATE TABLE foo_bar这样的名称(the_date DATE,双岁,双重量,双薪,INT eye_color};
我希望能够由此创建聚合功能:(我也许使用PostgreSQL语法)
CREATE AGGREGATE FUNCTION proc_foobar RETURNS REAL的soname myshlib.so ALIAS my_wrapper_func
我然后可以在MySQL查询从而使用它:
SELECT proc_foobar()作为like from FROM foo_bar WHERE the_date BETWEEN'09年1月1日'和'09年12月1日'
这个查询应该做的是从表foo_bar中获取所有匹配记录,将它们传递给我的包装函数processFooBar,然后将从接收到的记录中提取FooBar结构,然后将它们传递给执行该工作并返回值的C函数。简单
它的使用说明(伪)代码:
#ifdefined __cplusplus
extern "C" {
#endif
/* this is the wrapper function that mySQL calls and passes the records to */
double my_wrapper_func(/*Matching rows sent by mySQL + other info .. ?*/)
{
/* create FooBar Array from received record */
struct FooBar ** the_array = ExtractArrayFromRowset(/*some params*/);
double result = processFooBar(the_array, ARRAY_SIZE_MACRO(*the_array));
/* free resources */
FreeFooBarArray(the_array);
RETURN_DOUBLE(result); /* or similar macro to return a double in MySQL */
}
#ifdefined __cplusplus
};
#endif
任何人都可以提供一个小片段(或直接我一个片段),显示我怎么能写my_wrapper_func - 或更重要的一点作为C/C++中的扩展函数,我如何实现如上所述的编写聚合函数所需的功能。
谢谢,我会现在就开始阅读.. – 2009-12-16 16:23:44
是一个很好的链接,但我发现PostgreSQL的dodumentation更多在解释状态变量和状态转换函数的使用方面有用(比mySQL文档)。虽然我会接受你的回答。 – 2009-12-17 10:38:21
很酷。我正在学习UDF。如果我找到更多信息,我会确保在这里发布 – Yada 2009-12-17 12:00:33