繁体   English   中英

mysql存储过程中的变量声明

[英]Variables declaration in mysql stored procedure

我有两个版本的相同存储过程:

1)第一个是使用隐式声明,如果我去工作台,它会按预期工作。

DROP procedure IF EXISTS `Elmah_GetErrorXml`;
DELIMITER $$

CREATE PROCEDURE `Elmah_GetErrorXml` (IN  `pApplication` NVARCHAR(60),  IN  `pPageIndex`     INT,   IN  `pPageSize`  INT,   OUT `pTotalCount` INT)

BEGIN   
  SELECT COUNT(*) INTO `pTotalCount` FROM `Elmah_Error` WHERE `Application`= pApplication;

  SET @startRowIndex = pPageIndex * (pPageSize + 1);
  SET @page_Count = pPageSize;
  PREPARE STMT FROM 'SELECT * FROM `elmah_error` WHERE `Application`=Application ORDER BY `TimeUtc` DESC, `Sequence` DESC LIMIT ?,?';
  EXECUTE STMT USING @startRowIndex, @page_Count;
END$$
DELIMITER $$

2)第二个尝试使用显式声明,但是当我尝试将它运行到工作台时,我遇到了一些错误:

DROP procedure IF EXISTS `Elmah_GetErrorXml`;
DELIMITER $$
CREATE PROCEDURE `Elmah_GetErrorXml` (IN  `pApplication` NVARCHAR(60),  IN  `pPageIndex`     INT,   IN  `pPageSize`  INT,   OUT `pTotalCount` INT)
BEGIN
    DECLARE startRowIndex INT DEFAULT 0;
    DECLARE page_Count INT DEFAULT 0;
    SELECT COUNT(*) INTO `pTotalCount` FROM `Elmah_Error` WHERE `Application`= pApplication;
    SET startRowIndex = pPageIndex * (pPageSize + 1);
    SET page_Count = pPageSize;
    PREPARE STMT FROM 'SELECT * FROM `elmah_error` WHERE   `Application`=Application ORDER BY `TimeUtc` DESC, `Sequence` DESC LIMIT ?,?';
    EXECUTE STMT USING startRowIndex, page_Count;
END$$
DELIMITER $$

错误是:语法错误:意外的'startRowIndex'(标识符)语法错误:意外的page_Count(标识符)

我想知道在使用显式声明的情况下应该是正确的语法。 有什么建议吗?

注 1:我已经阅读了如何在 MySQL 中声明变量? 但我看不到存储过程版本 2 的问题。

注意 2:如果有人问我为什么不使用存储过程的第 1 版是因为我的 C# 安装程序抛出其他错误消息:“MySql.Data.MySqlClient.MySqlException : Parameter '@startRowIndex' must be defined”。

更新:此处描述了 sqlcommand 异常的原因: Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand?

当我将您的代码粘贴到 Workbench 中时,它显示了这一行的错误:

EXECUTE STMT USING startRowIndex, page_Count;

根据文档

在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围并且如果稍后在程序外执行该语句将不可用。 作为一种解决方法,请改用用户定义的变量,这些变量也具有会话作用域; 请参阅第 9.4 节,“用户定义的变量”

因此,换句话说,您不能将本地 ( DECLARE d) 变量传递给准备好的语句; 您只能传递会话变量( @变量。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM