2009-12-16 93 views
1

我需要为mySQL 5.x编写一个聚合扩展函数(用C实现)。我浏览过文档(包括浏览sql/udf_example.c),但没有发现任何简短的内容,并指出了我需要做的事情。mysql中的聚合UDF(用户定义函数)C

这就是问题:

  1. 我有一个C结构(美孚)
  2. 我有一个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++中的扩展函数,我如何实现如上所述的编写聚合函数所需的功能。

回答

1

不回答你关于MySQL的UDF的问题,但文章是相当不错的:

http://www.codeproject.com/KB/database/MySQL_UDFs.aspx

+0

谢谢,我会现在就开始阅读.. – 2009-12-16 16:23:44

+0

是一个很好的链接,但我发现PostgreSQL的dodumentation更多在解释状态变量和状态转换函数的使用方面有用(比mySQL文档)。虽然我会接受你的回答。 – 2009-12-17 10:38:21

+0

很酷。我正在学习UDF。如果我找到更多信息,我会确保在这里发布 – Yada 2009-12-17 12:00:33

相关问题