MySQL存储过程无用的错误

Posted

技术标签:

【中文标题】MySQL存储过程无用的错误【英文标题】:MySQL Stored Procedure unhelpful error 【发布时间】:2014-03-26 16:45:26 【问题描述】:

mysql 给了我“在 '' 附近使用的正确语法”作为响应我的 SP 的错误。

附加的SQL抛出上述错误,不知道为什么,SP需要放在左窗格中,但没有它就无法保存。

http://www.sqlfiddle.com/#!2/075db/3

知道为什么要这样做吗?

【问题讨论】:

【参考方案1】:

试试这个:

CREATE PROCEDURE Upsert_Page(
  pageID smallint,
  pageTitle varchar(50),
  pageName varchar(50),
  pageViewable tinyint,
  pageDeleted tinyint,
  pageMetaData varchar(5000),
  pageParent smallint,
  pageRequired tinyint,
  pageAdmin tinyint
)
BEGIN
  IF (SELECT 1 = 1 FROM Page WHERE Page.ID = pageID) THEN

    UPDATE `Page`
        SET `Page`.`Title` = pageTitle, 
            `Page`.`Name` = pageName, 
            `Page`.`IsViewable` = pageViewable, 
            `Page`.`IsDeleted` = pageDeleted, 
            `Page`.`MetaData` = pageMetaData, 
            `Page`.`ParentID` = pageParent, 
            `Page`.`IsRequired` = pageRequired, 
            `Page`.`IsAdmin` = pageAdmin
    WHERE `Page`.`ID` = pageID;

  ELSE
    begin
    DECLARE last_id int;
    INSERT INTO `Page`(`Title`, `Name`, `IsViewable`, `IsDeleted`, 
                       `MetaData`, `ParentID`, `IsRequired`, `IsAdmin`) 
    VALUES (pageTitle, pageName, pageViewable, pageDeleted, 
            pageMetaData, pageParent, pageRequired, pageAdmin);

    SET last_id = LAST_INSERT_ID();

    INSERT INTO `PageWidget`(`ID`,`WidgetID`,`PageID`) 
    SELECT 
        null, `Widget`.`ID`, last_id
    FROM `Widget`
    JOIN `WidgetType` ON `Widget`.`WidgetTypeID` = `WidgetType`.`ID`
    WHERE `WidgetType`.`IsUnique` = 1;
  end;
  END IF;
END;
/

现在可以正常编译了,请看这个演示:http://www.sqlfiddle.com/#!2/a3d58 (您需要滚动到左侧面板的底部) 有一些小错误 - 缺少分号、缺少反引号字符等。 一句话:IF ... THEN ... END 不需要BEGIN ... END 屏蔽,只需:

IF condition THEN
   statements 
   .....
   .....
ELSE
  statements
  ....
  ....
END IF;

【讨论】:

您好 Kordirko,感谢您的回复,我在 phpmyadmin sql 选项卡中尝试了您的示例,并收到错误“您的 SQL 语法有错误;请查看与您的 MySQL 对应的手册在“/”附近使用正确语法的服务器版本,当删除查询末尾的“/”时,该错误仍然很明显。sqlfiddle和phpmyadmin之间有区别吗? 请阅读此链接:***.com/questions/8080681/… 了解如何使用 phpmyadmin 创建存储过程。您需要设置一个分隔符(例如 $$),并将其放在最后一个 end 之后。请研究此链接了解详情。

以上是关于MySQL存储过程无用的错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 存储过程错误处理

错误创建存储过程 MySQL

MySQL 存储过程错误处理

MySQL存储过程错误处理

MySql存储过程调用错误

为啥存储过程没有在一个字符串中给出输出并且在 MySql 6.0 上执行的存储过程在 MySql 5.0 上给出错误