2016-03-31 34 views
1

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?

Antwort

1

Wenn ich Ihren Code in Workbench eingefügt, zeigte er den Fehler auf dieser Linie:

EXECUTE STMT USING startRowIndex, page_Count; 

Nach 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” .

Also mit anderen Worten, Sie kann nicht lokalen Pass (0.123.d) Variablen zu einer vorbereiteten Aussage; Sie können nur Sitzungsvariablen übergeben (@ Variablen.)

+0

Weitere Informationen finden Sie in diesem SO-Artikel (http://stackoverflow.com/questions/1471570/dynamic-mysql-with-local-variables). –

+0

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

Verwandte Themen