2016-03-31 6 views
1

У меня есть две версии одной и той же процедуры магазина:Переменные декларации в 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?

ответ

1

Когда я вставил свой код в Workbench, он показал ошибку на этой линии:

EXECUTE STMT USING startRowIndex, page_Count; 

По словам the documentation:

A statement prepared in stored program context cannot refer to stored procedure or function parameters or local variables because they go out of scope when the program ends and would be unavailable were the statement to be executed later outside the program. As a workaround, refer instead to user-defined variables, which also have session scope; see Section 9.4, “User-Defined Variables” .

Итак, другими словами, вы не можете пройти местный (DECLARE d) переменные для подготовленного оператора; вы можете передавать только переменные сеанса (@ переменных.)

+0

Для получения дополнительной информации см. [эту статью SO] (http://stackoverflow.com/questions/1471570/dynamic-mysql-with-local-variables). –

+0

Я считаю этот ответ правильным, потому что помогите мне понять, что я должен следовать с определенными пользователем переменными. Теперь я должен понять, почему mysql sqlcommand (.net-коннектор) выбрасывает эту ошибку: «@ startRowIndex» должен быть определен. «Спасибо вам обоим :) – Rolando