在mysql里怎样自定义函数,如何调用和执行?需要哪些设置?

jddf 2003-04-22 12:07:10
在mysql里怎样自定义函数,如何调用和执行?需要哪些设置?
最好有个例子
...全文
2595 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
swotcoder 2003-04-22
  • 打赏
  • 举报
回复
执行的方法很简单,就是下边::

加载
** create function <函数名称> returns {string|real|integer}
** soname <你定义的动态库位置>
释放!
** drop function <函数名称>
bombshell 2003-04-22
  • 打赏
  • 举报
回复
这是手册上的。仅供参考!

对于UDF的工作机制,函数必须用C或C++编写并且你的操作系统必须支持动态装载。MySQL源代码分发包括一个文件“sql/udf_example.cc”,它定义了5个新函数。请教这个文件看UDF调用约定怎样工作。

对每一个你想在SQL语句中使用的函数,你应该定义对应的C(或 C++)函数。在下面的讨论中,“xxx”用于一个函数名的例子。为了区别SQL和C/C++用法,XXX()(大写)表明SQL函数调用,而xxx()((小写)表明C/C++函数调用。

你编写实现XXX()的接口的C/C++函数是:

xxx()(必需的)
主函数。这是计算函数结果的地方。SQL 类型于你的C/C++函数返回类型的对应关系如下:SQL 类型 C/C++ 类型
STRING char *
INTEGER long long
REAL double

xxx_init()(可选)
为xxx()的初始化函数,它可用于:
检查传到XXX()的参数数量。
检查参数是一种所需的类型,或,另外地,当主函数被调用时,告诉MySQL,为了强制参数到你想要的类型。
分配任何由主函数所需的内存。
指定结果的最大长度。
指定(对REAL函数)小数位的最大数目。
指定结果是否能是NULL。
xxx_deinit()(可选)
为xxx()的结束函数,它应该释放初始化函数分配了的任何内存。
当一条SQL语句调用XXX()时,MySQL调用初始化函数xxx_init(),让它执行任何所需的设置,例如参数检查或内存分配。如果xxx_init()返回一个错误,SQL语句用一条错误消息并被放弃而主函数和结束函数不被调用,否则,为每行调用主函数xxx()一次。在所有行被处理完后,结束函数xxx_deinit()被调用,因此它能执行任何必要的清除。

所有函必须是线程安全的(不只是主函数,还有初始化和结束函数)。这意味着,你不允许分配任何改变的全局或静态变量!如果你需要内存,你应该在xxx_init()种分配它并且在xxx_deinit()中释放它。

14.1.1 UDF的调用顺序
主函数应该如下定义。注意返回类型和参数不同,取决于你是否在CREATE FUNCTION语句中声明SQL函数XXX()返回STRING、INTEGER或REAL:

对STRING函数:

char *xxx(UDF_INIT *initid, UDF_ARGS *args,
char *result, unsigned long *length,
char *is_null, char *error);

对INTEGER函数:

long long xxx(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);

对于REAL函数:

double xxx(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);

初始化和结束函数象这样被声明:

my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

void xxx_deinit(UDF_INIT *initid);

initid参数被传给所有3个函数,它指向一个UDF_INIT结构,被用来在函数之间传递信息。UDF_INIT结构成员列在下面。初始化函数应该填写它想要改变的任何成员。(对一个成员使用缺省值,不改变它。)

my_bool maybe_null
如果xxx()能返回NULL,xxx_init()应该设置maybe_null为1。如果参数的任何一个被声明maybe_null,缺省值是1。
unsigned int decimals
小数位数目。缺省值是在被传给主函数的参数中小数位的最大数目。(例如,如果函数传递1.34、1.345和1.3,缺省值将是3,因为1.345有3个小数位。
unsigned int max_length
字符串结果的最大长度。缺省值不同,取决于函数的结果类型。对字符串函数,缺省是最长的参数的长度。对整数函数,缺省是21位。对实数函数,缺省是13加上由initid->decimals指出的小数位数。(对数字函数,长度包括任何符号位或小数点字符。)
char *ptr
函数可为它自己的目的使用的一个指针。例如,函数能使用initid->ptr在函数之间传递分配的内存。在xxx_init()中,分配内存并将它赋给这个指针:
initid->ptr = allocated_memory;

在xxx()和xxx_deinit()中,参照initid->ptr来使用或释放内存。

14.1.2 参数处理
args参数指向一个UDF_ARGS成员,其结构列在下面:

unsigned int arg_count
参数个数。如果你想要函数用一个特定数量的参数被调用,在初始化函数中检查这个值。例如:
if (args->arg_count != 2)
{
strcpy(message,"XXX() requires two arguments");
return 1;
}

enum Item_result *arg_type
为每个参数的类型。可能的类型值是STRING_RESULT、INT_RESULT和REAL_RESULT。为了确保参数是一种给定的类型,而如果他们不是,返回一个错误,在初始化函数中检查arg_type数组。例如:
if (args->arg_type[0] != STRING_RESULT
&& args->arg_type[1] != INT_RESULT)
{
strcpy(message,"XXX() requires a string and an integer");
return 1;
}

作为另一种要求你的函数的参数类型是特定类型的选择,你可以使用初始化函数设置arg_type成员是你想要的类型。这导致MySQL为每个xxx()调用强制参数为那些类型,例如,为了指定头 2个参数到字符串和整数的强制,在xxx_init()中做这些:

args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;

char **args
args->args将关于你的函数用它调用的参数的一般特性的信息传递到初始化函数。对一个常数参数i,args->args[i]指向参数值。(见下面关于如何正确存取值的指令) 对一个非常数的参数,args->args[i]是0。一个常数参数只是使用常数的一个表达式,例如3或4*7-2或SI(3.14)。一个非常数参数是引用可能每行不同的值的一个表达式,例如列名字或用非常数参数调用的函数。对主函数的每次调用,args->args包含对当前正在处理的行所传递的实际参数。函数可以如下地引用一个参数i:
一个STRING_RESULT类型的参数由一个字符串指针加一个长度给出,允许处理任意的长度的二进制的数据或数据。字符串内容可由args->args[i]得到并且字符串长度是args->lengths[i]。你不应该假设字符串是以空(null)结束的。
对于一个INT_RESULT类型的参数,你必须强制转换args->args[i]为一个long long值:
long long int_val;
int_val = *((long long*) args->args[i]);

对一个REAL_RESULT类型的参数,你必须强制转换args->args[i]为一个double值:
double real_val;
real_val = *((double*) args->args[i]);


unsigned long *lengths
对初始化函数,lengths数组指出每个参数的最大字符串长度。对于主函数调用,lengths包含为当前正在被处理的行传递的任何字符串参数的实际长度。对INT_RESULT或REAL_RESULT类型的参数,lengths仍然包含参数的最大长度(就象对初始化函数)。
第1章 PHP 5基础 1.1 简介 1.1.1 PHP是什么 1.1.2 初步认识PHP代码 1.2 PHP的安装 1.2.1 Linux下安装.Apache和PHP 1.2.2 Windows下安装Apache和PHP 1.3 PHP配置 1.3.1 PHP配置文件 1.3.2 PHP常用配置选项 1.3.3 加载扩展库 1.4 本章小结 第2章 网站开发语法基础 2.1 基本语法 2.2 数据类型 2.2.1 布尔型 2.2.2 整型 2.2.3 浮点型 2.2.4 字符串 2.2.5 数组 2.2.6 对象 2.2.7 资源 2.2.8 NULL 2.2.9 类型转换 2.3 变量 2.3.1 变量的赋值 2.3.2 预定义变量 2.3.3 变量作用域 2.3.4 可变变量 2.4 常量 2.4.1 自定义常量 2.4.2 魔术常量 2.5 表达式 2.6 运算符 2.6.1 算术运算符 2.6.2 字符串运算符 2.6.3 比较运算符 2.6.4 逻辑运算符 2.6.5 位运算符 2.6.6 赋值运算符 2.6.7 数组运算符 2.6.8 类型运算符 2.6.9 错误控制运算符 2.6.10 执行运算符 2.6.11 运算符的优先级 2.7 流程控制 2.7.1 if结构 2.7.2 switch结构 2.7.3 while循环 2.7.4 for循环 2.7.5 foreach语句 2.7.6 declare语句 2.7.7 exit和retunl语句 2.8 包含代码 2.9 本章小结 第3章 函数 3.1 用户自定义函数 3.1.1 函数调用与函数定义 3.1.2 递归函数 3.2 函数的参数 3.2.1 按值传递参数 3.2.2 通过引用传递 3.2.3 默认参数值 3.2.4 可变长度参数列表 3.3 函数返回值 第4章 类与对象 第5章 字符串 第6章 数组 第7章 PHP高级应用技术 第8章 PHP模板 第9章 MySQL快速入门 第10章 MySQL数据库管理 第11章 MySQL5进阶 第12章 文章发布系统 第13章 电子商务系统

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧