【问题标题】:how can I fix this sp in phpmyadmin? [closed]如何在 phpmyadmin 中修复这个 sp? [关闭]
【发布时间】:2011-11-01 00:10:01
【问题描述】:

我正在尝试在 phpmyadmin 中编写存储过程,但出现此错误,我也在 navicat 中执行过,但出现相同的错误,有人可以帮我解决它吗?非常感谢您的帮助

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“IN comienzo int, IN termino int) BEGIN SELECT usuario.nombre, LEF”附近使用正确的语法

这是我的存储过程:

    CREATE PROCEDURE store(
  IN actualUser varchar(20)
)

SET @comienzo2 = comienzo;
SET @termino2 = termino;
SET @actualUser2 = actualUser;

BEGIN
SELECT
usuario.nombre,
LEFT(titulo, 20) as titulo,
LEFT(mensaje, 20) as mensaje,
correo.fecha,
correo.id_correo,
correo_has_usuario.correo_id_correo,
correo_has_usuario.destinatario_id_usuario,
correo_has_usuario.eliminado,
correo_has_usuario.leido
FROM
correo_has_usuario 
Inner Join correo ON correo_has_usuario.correo_id_correo = 
correo.id_correo
Inner Join usuario ON usuario.id_usuario = 
correo.usuario_id_usuario
WHERE
correo_has_usuario.destinatario_id_usuario = actualUser AND
correo_has_usuario.eliminado =  0 ORDER BY correo.fecha DESC
LIMIT comienzo,termino;
END$$

您好,再次感谢您的回答我收到此错误消息 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'SET @termino2 = termino; 附近使用的正确语法; SET @actualUser2 = 实际用户; BEGIN PREPARE stmt ' 在第 8 行

【问题讨论】:

  • 您还没有使用DELIMITER将分隔符更改为$$

标签: php mysql pdo phpmyadmin mysql-error-1064


【解决方案1】:

您错过了第 2 行 VARCHAR 的数据长度

例如IN actualUser varchar(20)

你的limit语句也是不正确的,会抛出一个错误。在存储过程中使用时,限制必须是数字或局部变量。见

http://dev.mysql.com/doc/refman/5.5/en/select.html

在存储的程序中,可以使用 LIMIT 参数指定 MySQL 的整数值例程参数或局部变量 5.5.6.

为此,您必须将参数设置为变量,例如

SET @comienzo2 = comienzo;
SET @termino2 = termino;
SET @actualUser2 = actualUser;

那么,您必须准备好然后执行它,而不是简单地运行您的 select 语句。

PREPARE stmt FROM 'SELECT ... LIMIT ?, ?';
EXECUTE stmt USING @comienzo2, @termino2;
DEALLOCATE PREPARE stmt;

你的 where 语句也是如此。

例子:

DELIMITER $$
CREATE PROCEDURE store(
  IN actualUser varchar(20),
  IN comienzo int,
  IN termino int
)

SET @comienzo2 := comienzo;
SET @termino2 := termino;
SET @actualUser2 := actualUser;

BEGIN
PREPARE stmt FROM 'SELECT
    usuario.nombre,
    LEFT(titulo, 20) as titulo,
    LEFT(mensaje, 20) as mensaje,
    correo.fecha,
    correo.id_correo,
    correo_has_usuario.correo_id_correo,
    correo_has_usuario.destinatario_id_usuario,
    correo_has_usuario.eliminado,
    correo_has_usuario.leido
    FROM
    correo_has_usuario 
    Inner Join correo ON correo_has_usuario.correo_id_correo = 
    correo.id_correo
    Inner Join usuario ON usuario.id_usuario = 
    correo.usuario_id_usuario
    WHERE
    correo_has_usuario.destinatario_id_usuario = ? AND
    correo_has_usuario.eliminado =  0 ORDER BY correo.fecha DESC
    LIMIT ?,?;'
EXECUTE stmt USING @actualUser2, @comienzo2, @termino2;
DEALLOCATE PREPARE stmt;
END;
$$

【讨论】:

  • 那么如何在存储过程中定义一个限制?我不明白如果我需要通过限制,你能解释一下吗?谢谢回答
  • 我用我的问题更新了我的答案,我仍然无法在navicat或phpmyadmin中使用它,我还编辑了我正在使用php和pdo的标签
  • 对不起,如果我的回答有误导性。我已经用一个没有语法错误的例子更新了它,但我没有测试它,因为我没有数据库结构。
  • 我用新的错误更新我的问题,再次感谢您的回答
  • 我可以把脚本 sql 发给你吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-12-01
  • 2017-05-28
相关资源
最近更新 更多