mysql函数怎么提交 mysql手动提交( 三 )


返回类型是什么?有4个选择:
类型描述
STRING一个合法的字符串,转换成char*类型
INTEGER一个普通的整型变量 , 转换成64位的整型
REAL型一个俘点数,转换成double型
DECIAML型这个并没真正的结束,MYSQL将做字符串对待
现在开始讨论关于非聚合函数 。必须声明并执行一些MYSQL使用UDF时用到的函数,但首先一些必要的结构必须并确:
UDF_INIT:
类型名称描述
my_boolmaybe_null是1如果函数能返回NULL
unsigned intdecimals针对REAL函数
unsigned longmax_length针对字符串函数
char *ptr自由指针针对函数的数据
my_boolconst_item0如果结果是独立的
UDF_ARGS:
类型名称描述
unsigned intarg_count成员数量
enum Item_result *arg_type成员类型的数组
char **args指向成员的指针的数组
unsigned long *lengths成员长度的数组(针对字符串)
char *maybe_null"maybe_null"标记的数组
char **attributes指向成员属性的指针的数组
unsigned long *attribute_lengths属性长度数组
现在看一下该函数:
De-/Initialization:
Collapseextern "C" my_bool MyTest_init(UDF_INIT *initid, UDF_ARGS *args,
char *message)
{
//非常重要的一件事是建立内存
//需要
//需要一个很长的变量来保存检测数
//虽然该例中不需要
longlong* i = new longlong; // 建立变量
*i = 0;// 设初值
//指针变量中保存为一个字符指针
//确认不会遇到类型问题
initid-ptr = (char*)i;
//检测成员的格式
if (args-arg_count != 1)
{
strcpy(message,"MyTest() requires one arguments");
return 1;
}
if (args-arg_type[0] != INT_RESULT)
{
strcpy(message,"MyTest() requires an integer");
return 1;
}
return 0;
}
extern "C" void MyTest_deinit(UDF_INIT *initid)
{
//这里必须清空所分配的内存
//引入函数
delete (longlong*)initid-ptr;
}
The actual function:
extern "C" longlong MyTest(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error)
{
/*最后这是实际的工作部分 。该函数为每个记录调用 , 返回值或指向当前值的指针保存在UDF_ARGS变量中 。必须获得值 , 完成计算并返回值 。注意可以通过UDF_INIT变量进入MyTest_init中分配的内存,该例中将为每个值设置为5
*/
return *((longlong*)args-args[0])+5;
}
全部完成!现在必须编译连接库,然后将其拷贝到操作系统可以加载的目录下 。通常在WINDOWS里是系统变量的定义路径 。个人使用的是MYSQL服务器的bin目录 。必须确认该目录是其它MYSQL不能访问的 。然后确认所有MYSQL需要的函数功能 。
必须告诉MYSQL,这必须直接了当:执行以下SQL指令:
CREATE [AGGREGATE] FUNCTION MyTest
RETURNS [INTEGER|STRING|REAL|DECIMAL] SONAME the_libraries_exact_name
现在可以想使用其他函数一样使用它了 。
5)成员函数:
现在说一下成员函数 。当的UDF是个成员函数 , 必须增加一些函数,一些函数在不同的方式中使用 。调用次序是:
调用yTest_init来分配内存(就象一般的UDF一样)
MYSQL将表分类是通过GROUP BY
每组里的第一行调用MyTest_clear
每组里的第一列调用 MyTest_add
在组改变后或最后一列改变后调用MyTest得到结果
重复3到5直到所有列被处理 。
调用MyTest_deinit清空内存
现在让看一下新的聚合函数所需的函数 。该例中将简单的添加所有的值 。(就象本地SUM函数)
void MyTest_clear(UDF_INIT *initid, char *is_null, char *error)
{

推荐阅读