MySQL 5.7存储过程语法错误,通过phpadmin和Ubuntu 16.04

时间:2017-01-20 20:18:37

标签: mysql stored-procedures phpmyadmin syntax-error

我是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 ;

非常感谢任何有关通用问题的帮助!

2 个答案:

答案 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,但它正确编译。