我需要为mySQL 5.x编写一个聚合扩展函数(用C实现)。我已经仔细检查了文档(包括浏览sql / udf_example.c),但我找不到任何简短的内容,并向我展示了我需要做的事情。
这是问题所在:
我有一个C函数,它接受这些Foo结构的数组,对数组执行操作,并返回一个double。
struct FooBar { char * date; 双倍年龄; 双重怀疑; 双薪; int eye_color; };
/ *处理功能 / double processFooBars(struct FooBar foobars,const size_t size);
/ * MySQL表* / CREATE TABLE foo_bar(the_date DATE,double age,double weight,double salary,int eye_color};
我希望能够创建一个聚合函数:(我可能使用PostgreSQL语法)
CREATE AGGREGATE FUNCTION proc_foobar RETURNS REAL soname myshlib.so ALIAS my_wrapper_func
然后我可以在MySQL Query中使用它:
SELECT proc_foobar()as likeability FROM foo_bar WHERE the_date BETWEEN'1-Jan-09'和'1-Dec-09'
这个查询应该做的是从表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 ++中的扩展函数。
答案 0 :(得分:1)
没有回答你的问题,但有关MySQL udf的文章非常好: