我是MySQL 5.7存储过程的新手,也是有用的弹出编辑器。我有一个查询,当放入常规SQL编辑框时工作,但当我尝试从中创建存储过程时失败。我怀疑@rank:=@rank+1
是问题,但当然MySQL对缩小范围没有多大帮助。
关键在于按字段(ccstr
)对某些行进行排序,然后选择项目#N,其中N是输入参数。
这可以作为直接SQL,用一个值替换N,比如说3
SET @rank:=0;
SELECT ccstr FROM
( SELECT @rank:=@rank+1 AS rank, ccstr
FROM cards
ORDER BY ccstr ASC) as B
WHERE B.rank = N;
我尝试过使用弹出式编辑器,以及我能想到的各种混合和匹配,如下所示,但都失败了:
DELIMITER //
CREATE PROCEDURE readnth
(IN NDX INT)
DECLARE @rank INT;
SET @rank := 0;
SELECT ccstr FROM
(select @rank:=@rank +1 as rank, ccstr from cards
order by ccstr ASC)
as b where b.rank=ndx;
end //
delimiter ;
非常感谢任何有关通用问题的帮助!
答案 0 :(得分:1)
删除该行:
DECLARE @rank INT;
以@
开头的变量无法声明。
另一种编码方式是使用预先准备好的声明:
PREPARE stmt FROM CONCAT('SELECT ccstr FROM cards ORDER by ccstr LIMIT ', (ndx+1), ', 1');
EXECUTE stmt;
您必须使用预准备语句,因为LIMIT
的参数必须是常量,而不是表达式。
答案 1 :(得分:0)
我不理解我以前犯过的所有新手错误。但是,通过反复试验,以下代码可以完成我需要的工作。这是由MySQL 5.7处理一个更简单的语句并调整它来生成的,MySQL定义了确定性,包含SQL,安全Definer optins,我把程序名放在反引号中,我宣布一个非临时的变量。
DROP PROCEDURE `thirdguy`;
CREATE DEFINER=`root`@`localhost` PROCEDURE `thirdguy`(IN `param` INT)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
declare NNN int default 0;
set NNN:=param-1;
SELECT * FROM `cards` order by ccstr ASC
limit 1 offset NNN ;
END
评论 - 无论如何,代码在弹出编辑器中显示为WRONG,但它正确编译。