У меня есть две версии одной и той же процедуры магазина:Переменные декларации в MySQL хранимые процедуры
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) второй пытается использовать явное объявление, но когда я пытаюсь запустить его, чтобы workbech я получил некоторые ошибки:
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: Я прочитал сообщение от How to declare a variable in MySQL? , но я не вижу проблемы с версией 2 хранимой процедуры.
Примечание 2: если кто-то спросить, почему я не использую версию 1 хранимой процедуры, потому что мой C# инсталлятор бросает другое сообщение об ошибке: «MySql.Data.MySqlClient.MySqlException:„@startRowIndex“параметр должен быть определены «.
UPDATE: причина исключения из SqlCommand описана здесь: Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand?
Для получения дополнительной информации см. [эту статью SO] (http://stackoverflow.com/questions/1471570/dynamic-mysql-with-local-variables). –
Я считаю этот ответ правильным, потому что помогите мне понять, что я должен следовать с определенными пользователем переменными. Теперь я должен понять, почему mysql sqlcommand (.net-коннектор) выбрасывает эту ошибку: «@ startRowIndex» должен быть определен. «Спасибо вам обоим :) – Rolando