MySql编写自定义函数、存储过程语法(附详细案例

问题场景
尝试编写mysql函数对记录中的数据排序完后 , 根据需求取第几条数据时 , sql中的limit @变量,1 语法一直不通过编译 。
报错信息如下:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@N,1
问题原因
limit n,m语句语法要求是 , 后面的两个参数必须为整数常量 , 不可以为变量 。所以在函数中 * from a order by xx limit @变量,1就会函数编译不通过 。

MySql编写自定义函数、存储过程语法(附详细案例

文章插图
解决方法 1、使用整数常量
首先根据函数参数接收一个动态的整数参数 , 如果整数参数不需要运算那直接放在limit后面 。
例如:当 test(1);时就会返回 xxx limit 1,1的数据
CREATE FUNCTION test(N INT) RETURNS doubleBEGINRETURN select distinct gz from gzb order by gz desc limit N,1;END
如果函数参数需要参与运算后才能得出实际值 , 也是使用常量 , 因为limit (n-1),1也是会编译不通过的 。因为无论是2-1或者n-1都是变量 。所以我们得把值提前处理变成常量 。
例如:
CREATE FUNCTION test(N INT) RETURNS doubleBEGINset cl = N-1RETURN select distinct gz from gzb order by gz desc limit cl,1;END
这样就不会报错 , 因为cl的值是已经通过n-1得到了才执行sql , 而limit (n-1),1或者set @cl = n-1;limit @cl,1都是等到sql执行后才计算值 , 所以就会编译不通过 。
2、编写存储过程+预编译
在mysql-5.0.7以后的版本 , 更新了可以预处理sql语句 , 在处理的时候再放入变量执行 。
CREATE PROCEDURE test(in n INT)BEGINset @mmsql = 'select distinct gz from gzb order by gz desc limit ?,1';set @cl = n-1;prepare exce from @mmsql;EXECUTE exce USING @cl;DEALLOCATE prepare exce;//删除预编译语句END
或者直接使用 into进行变量赋值 , 根据b表进行循环查或插入操作
【MySql编写自定义函数、存储过程语法(附详细案例】drop procedure if exists test;CREATE PROCEDURE test(in n INT)BEGINdeclare i int;set i = 0;select count(1) into @j from b;while i < @j do//查询或插入语句end whileEND