问题场景
尝试编写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就会函数编译不通过 。
文章插图
解决方法 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
- mysql使用utf8mb4
- 3 SQL笔记——MySQL数据类型(超详细且易理解)
- 建立中间表 在MySQL中建立多对多关系的映射
- mysql字符串排序规则_MySQL字符集和排序规则
- mysql 显示所有用户_mysql查看全部用户
- 可自定义选择,可自定义输入 element select 自定义option
- Mysql—— 三种子查询
- Unity Timeline 自定义 Signal的使用
- 6 MySQL数据库--数据库连接池
- 【MySQL】mysql连接池