MySQL调用存储过程错误
MySQL Calling A Stored Procedure Error
我真的很希望有人能帮助我。
我有一个 SQL Server 2014 数据库,用于我编写的桌面应用程序。不得不扩展后,我想转换为 MySQL 以通过 Internet 访问数据库。
我使用 MySQL WorkBench 迁移工具将所有表和数据从 SQL 服务器复制到 MySQL 服务器。唯一的问题是程序不会复制,只好手动修改。
MySQL中的过程示例:
DELIMITER $$
CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders WHERE DeliverySuburb = @SuburbID$$
DELIMITER ;
服务器创建了程序,所有不使用 IN 输入的程序都显示了它们必须的内容,但是用户输入的程序给我一个错误:
从 PhpMyAdmin SQL 调用时:
错误
SQL query: Edit Edit
SET FOREIGN_KEY_CHECKS = ON;
MySQL said: Documentation
2014 - Commands out of sync; you can't run this command now
当我运行 C# Winforms App 中的过程时,它只是returns 一个空结果集。
我用来调用程序的代码:
SET @p0='1'; CALL `sp_GetAllOrdersBySuburb`(@p0);
当我 运行 程序中的代码作为正常 SQL 查询时,它也会 returns 预期的数据。
我希望这是足够的信息,希望这不是一个重复的问题,但我环顾四周,仍然没有找到任何帮助。
谢谢
我想,你的问题可能是你在定义过程时的定界符。
此外,当使用反引号定义您的参数时(否则 @
将不被允许),您在访问参数时也需要它们:
DELIMITER $$ /* make $$ the delimiter for actually executing something */
CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders WHERE DeliverySuburb = `@SuburbID`; /* normal ; here, you just define your proc */
$$ /* now execute the definition */
DELIMITER ; /* reset the delimiter */
对于分隔符:
您更改定界符是因为您不希望 过程中的任何 ;
被解释为执行定界符,而是成为过程的一部分。之后,您想执行整个定义,然后重新设置分隔符。
对于@
参数:
@
是保留字符仅用于访问全局变量。如果你真的想在你的参数中使用 @
,你需要反引号才能完成这项工作。反引号允许您使用空格、保留字甚至奇怪的字符或那些在常规语法中具有特殊含义并且不允许在标识符中使用的字符,否则无论如何都会在标识符中使用。但是,您还必须使用反引号来正确取消引用。
`@identifier`
和
@identifier
解决不同的事情。也就是说,你需要
SELECT * from Orders WHERE DeliverySuburb = `@SuburbID`;
而不是
SELECT * from Orders WHERE DeliverySuburb = @SuburbID;
我真的很希望有人能帮助我。
我有一个 SQL Server 2014 数据库,用于我编写的桌面应用程序。不得不扩展后,我想转换为 MySQL 以通过 Internet 访问数据库。
我使用 MySQL WorkBench 迁移工具将所有表和数据从 SQL 服务器复制到 MySQL 服务器。唯一的问题是程序不会复制,只好手动修改。
MySQL中的过程示例:
DELIMITER $$
CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders WHERE DeliverySuburb = @SuburbID$$
DELIMITER ;
服务器创建了程序,所有不使用 IN 输入的程序都显示了它们必须的内容,但是用户输入的程序给我一个错误: 从 PhpMyAdmin SQL 调用时: 错误
SQL query: Edit Edit
SET FOREIGN_KEY_CHECKS = ON;
MySQL said: Documentation
2014 - Commands out of sync; you can't run this command now
当我运行 C# Winforms App 中的过程时,它只是returns 一个空结果集。
我用来调用程序的代码:
SET @p0='1'; CALL `sp_GetAllOrdersBySuburb`(@p0);
当我 运行 程序中的代码作为正常 SQL 查询时,它也会 returns 预期的数据。
我希望这是足够的信息,希望这不是一个重复的问题,但我环顾四周,仍然没有找到任何帮助。
谢谢
我想,你的问题可能是你在定义过程时的定界符。
此外,当使用反引号定义您的参数时(否则 @
将不被允许),您在访问参数时也需要它们:
DELIMITER $$ /* make $$ the delimiter for actually executing something */
CREATE DEFINER=`johandre`@`%` PROCEDURE `sp_GetAllOrdersBySuburb`( IN `@SuburbID` VARCHAR(50) )
NO SQL
SELECT * from Orders WHERE DeliverySuburb = `@SuburbID`; /* normal ; here, you just define your proc */
$$ /* now execute the definition */
DELIMITER ; /* reset the delimiter */
对于分隔符:
您更改定界符是因为您不希望 过程中的任何 ;
被解释为执行定界符,而是成为过程的一部分。之后,您想执行整个定义,然后重新设置分隔符。
对于@
参数:
@
是保留字符仅用于访问全局变量。如果你真的想在你的参数中使用 @
,你需要反引号才能完成这项工作。反引号允许您使用空格、保留字甚至奇怪的字符或那些在常规语法中具有特殊含义并且不允许在标识符中使用的字符,否则无论如何都会在标识符中使用。但是,您还必须使用反引号来正确取消引用。
`@identifier`
和
@identifier
解决不同的事情。也就是说,你需要
SELECT * from Orders WHERE DeliverySuburb = `@SuburbID`;
而不是
SELECT * from Orders WHERE DeliverySuburb = @SuburbID;