【问题标题】:MySQl 5.6.28 Error when trying to pass a vatiable to limit in select statementMySQl 5.6.28 尝试在 select 语句中传递变量以限制时出错
【发布时间】:2026-01-29 13:20:04
【问题描述】:

尝试创建一个存储过程,该过程采用几个在 select 语句中使用的 IN 变量:

   CREATE PROCEDURE getevents 

( mytoday varchar(64),nextWeek varchar(64),lon varchar(64),lat varchar(64),mylimit INT ) 开始 选择 events.Open_All_Year,events.Category as PictureName,events.EventID,events.Title,events.Long_Description,events.Times_Fees,events.Event_Attraction,events.Event_Street1,events.Event_Street2,events.Event_Postcode,events.Event_Town,events.Event_County ,events.Latitude_degs, events.Longitude_degs,events.Short_Description, CASE WHEN (opening_dates.Start_Date = mytoday) THEN mytoday ELSE opening_dates.Start_Date END as Start_Date, opening_dates.Stop_Date, ((ACOS(SIN( lat * PI()/180) * SIN(Latitude_degs * PI()/180) + COS(lat * PI() / 180) * COS(Latitude_degs * PI() / 180) * COS((lon)*PI( )/180))*180/PI())*60*1.1515 ) 作为距离, webID, events.Wifi, events.Dogs, events.Disabled, events.Fee, events.Telephone, events.Email, events.Inactive FROM events,opening_dates where(events.EventID = opening_dates.FKEvent) AND (Review = false) AND (Inactive = 0) AND (((Start_Date = mytoday)) OR (Start_Date between mytoday and nextWeek) ) ORDER BY 距离,Start_Date ASC 限制 mylimit; 结尾;

给出一个无用的 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的 '' 附近使用正确的语法

【问题讨论】:

  • 去掉$-limit mylimit
  • 试过了,出现 SQL 语法错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 7 行的 '' 附近使用正确的语法

标签: mysql stored-procedures


【解决方案1】:

您的 mysql 存储过程调用中不能有未扩展的 php 变量,例如 $mylimit 或 $mytoday。要么你必须在运行 create procedure 命令时扩展它们,使它们成为固定参数,要么你必须创建一个带参数的存储过程,并在调用存储过程时提供参数运行时间。

查询中的参数仅通过名称引用,不需要像php中那样使用$前缀,也不需要用单引号将它们括起来以标记字符串。

另外,请注意您如何定义存储过程,尤其是使用分隔符命令 - 请参阅defining stored procedures 上的 mysql 文档

【讨论】:

  • 它们在运行时提供,( mytoday varchar(64),nextWeek varchar(64),lon varchar(64),lat varchar(64),mylimit INT ) 将它们设置为 IN 变量很明显,问题在于创建 SP,而不是运行它(还没有做到这一点)
  • 我试图通过执行 SQL 添加 SP。 $ 符号导致了问题 - 我已经通过 phpmyadmin Web 界面将其添加为一个过程,并且它接受了声明。谢谢指点