[英]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.