Ich habe zwei Versionen des gleichen Speichervorganges:Variablendeklaration in mysql gespeicherte Prozedur
1) Die erste implizite Deklaration verwendet, und wie erwartet funktioniert, wenn ich zu Werkbank gehen.
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) die zweite versucht, explizite Deklaration zu verwenden, aber wenn ich laufe versuchen Sie es in workbech ich einige Fehler bekam:
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 $$
Die Fehler sind: Syntaxfehler: unerwartetes ‚StartRowIndex '(Bezeichner) Syntax Fehler: unerwartete page_Count (Kennung)
Ich würde gerne wissen, dass sollte die richtige Syntax für die explizite Deklaration verwenden. Irgendein Vorschlag?
Hinweis 1: Ich habe den Beitrag von How to declare a variable in MySQL? gelesen, aber ich kann das Problem mit der Version 2 der gespeicherten Prozedur nicht sehen.
Anmerkung 2: Wenn jemand fragen, warum ich ist bin nicht die Version 1 des gespeicherten Prozedur, weil mein C# Installer Nachricht andere Fehler wirft: „MySql.Data.MySqlClient.MySqlException: Parameter‚@startRowIndex‘sein muss, definiert. "
UPDATE: der Grund für die Ausnahme von sqlcommand ist hier beschrieben: Is it possible to use a MySql User Defined Variable in a .NET MySqlCommand?
Weitere Informationen finden Sie in diesem SO-Artikel (http://stackoverflow.com/questions/1471570/dynamic-mysql-with-local-variables). –
Ich markiere diese Antwort als richtig, weil mir helfen zu verstehen, dass ich mit benutzerdefinierten Variablen folgen muss. Jetzt muss ich verstehen, warum mysql sqlcommand (.net connector) diesen Fehler wirft: "@ startRowIndex 'muss definiert werden." Danke euch beiden :) – Rolando