社区
MySQL
帖子详情
在mysql里怎样自定义函数,如何调用和执行?需要哪些设置?
jddf
2003-04-22 12:07:10
在mysql里怎样自定义函数,如何调用和执行?需要哪些设置?
最好有个例子
...全文
2644
2
打赏
收藏
在mysql里怎样自定义函数,如何调用和执行?需要哪些设置?
在mysql里怎样自定义函数,如何调用和执行?需要哪些设置? 最好有个例子
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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仍然包含参数的最大长度(就象对初始化函数)。
临沂市L1到L5五级街道街区分区数据集shp格式数据
本资源为临沂市L1到L5五级街道街区分区数据集SHP格式数据。数据涵盖临沂市全域范围,包含从省级到区级、街道级、社区级、网格级共五级行政区划边界矢量数据,数据精度高、边界清晰完整,包含完整的地名、行政区划代码、面积等属性字段。数据为标准Shapefile格式,可在ArcGIS、QGIS、SuperMap等GIS软件中直接打开编辑,适用于城市规划、人口统计、商业选址、物流配送、区域分析、GIS空间分析等多种应用场景,是城市数字化管理与空间分析的重要基础数据。
【无人机三维路径规划】PSO无人机路径规划3D城市(Matlab实现)
内容概要:本文基于粒子群优化算法(PSO)实现无人机在三维城市环境中的路径规划,利用Matlab进行仿真与代码实现,旨在解决复杂城市地形下无人机避障、路径优化及高效导航的问题。通过构建三维空间模型,综合考虑路径长度、飞行高度、障碍物威胁与转弯成本等多维度约束,形成最低成本的飞行路径。文中详细阐述了PSO算法在路径优化中的应用机制,并通过仿真实验验证其在动态城市环境中的有效性与鲁棒性。; 适合人群:具备Matlab编程基础,从事无人机导航、智能优化算法或路径规划相关研究的科研人员及工程技术人员,尤其适合研究生及以上学历的研究者。; 使用场景及目标:①应用于城市物流配送、应急救援、巡检监控等无人机三维路径规划实际场景;②为研究者提供基于PSO算法的路径规划实现方案,促进智能优化算法在无人机自主导航中的应用与发展;③支持算法对比与改进,推动高维非线性优化问题的求解能力提升。; 阅读建议:建议读者结合Matlab代码运行仿真,深入理解算法参数
设置
与路径生成逻辑,同时可尝试引入其他优化算法进行性能对比,进一步探索路径平滑、动态避障等高级功能的实现。
【期刊论文复现】多元宇宙算法求解电力系统多目标优化问题(Matlab实现)
【期刊论文复现】多元宇宙算法求解电力系统多目标优化问题(Matlab实现)内容概要:本文复现了期刊论文中提出的多元宇宙算法(Multi-Verse Optimizer, MVO)用于求解电力系统中的多目标优化调度问题,采用Matlab进行代码实现。该算法受宇宙中黑洞、白洞和虫洞等天文现象启发,通过数学建模模拟多目标搜索过程,具有较强的全局寻优能力和收敛性能。文中将其应用于典型的电力系统经济调度场景,如考虑燃料成本、排放量等多个优化目标的微电网或多能源系统调度问题,通过构建合理的数学模型和约束条件,实现对多个冲突目标的协同优化。同时,文章提供了完整的代码框架与仿真结果,便于读者理解和复现。; 适合人群:具备一定Matlab编程基础和优化算法基础知识的研究生、科研人员及从事电力系统优化调度工作的工程师。; 使用场景及目标:①学习和掌握新型智能优化算法——多元宇宙算法的基本原理与实现方法;②将其应用于电力系统经济调度、微电网优化、多目标决策等领域的模型求解;③为科研工作提供可复现的代码参考和技术支持。; 阅读建议:建议读者结合Matlab代码逐行理解算法实现细节,重点关注目标函数建模、约束处理及MVO算法核心迭代逻辑,并尝试在不同测试系统中进行参数调优与性能对比,以深入掌握其应用技巧。
chrome-devtools-mcp
面向智能体的 Chrome DevTools(chrome-devtools-mcp)可以让你的编码智能体(如 Antigravity、Claude、Cursor 或 Copilot) 控制并检查正在运行的 Chrome 浏览器。它作为 Model-Context-Protocol (MCP)服务器运行,让你的 AI 编码助手充分发挥 Chrome DevTools 的能力, 实现可靠的自动化、深入的调试和性能分析。 同时提供 CLI,可在不使用 MCP 的情况下使用。
MySQL
57,062
社区成员
56,759
社区内容
发帖
与我相关
我的任务
MySQL
MySQL相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MySQL相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章