2016-06-30 32 views
0

ich die folgende gespeicherte Prozedur bin mit:MySql gespeicherte Prozedur kehrt Wertfehler

DELIMITER $$ 
USE `customer`$$ 
DROP PROCEDURE IF EXISTS `InsertCustomerEmail`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertCustomerEmail`(IN p_Customer_ID INT(11), 
            IN p_from_who VARCHAR(50), 
            IN p_to_whom VARCHAR(50), 
            IN p_CC VARCHAR(50), 
            IN p_BCC VARCHAR(50), 
            IN p_Subject VARCHAR(500), 
            IN p_Massage VARCHAR(4000), 
            IN p_Is_Sent BIT(1), 
            IN p_Sent_When DATE, 
            IN p_Is_Active BIT(1), 
            OUT new_ID INT) 
BEGIN 
    INSERT INTO customer_emails ( 
     `Customer_ID`, 
     `from_who`, 
     `to_whom`, 
     `CC`, 
     `BCC`, 
     `Subject`, 
     `Massage`, 
     `Is_Sent`, 
     `Sent_When`, 
     `Is_Active` 
     ) VALUES (p_Customer_ID, 
       p_from_who, 
       p_to_whom, 
       p_CC, 
       p_BCC, 
       p_Subject, 
       p_Massage, 
       p_Is_Sent, 
       p_Sent_When, 
       p_Is_Active); 
    SET @new_ID=SCOPE_IDENTITY(); 
END$$ 
DELIMITER ; 

Meine Datenbank hat Spalte eine Autoinkrement-ID, ich möchte diese ID zurückzukehren (die letzte hinzugefügt) in der New_ID Variable aber wenn ich den Aufruf für die Prozedur ausführen, gibt es NULL für die New_ID zurück.

Irgendwelche Vorschläge?

Danke!

+1

Markieren Sie die verwendeten DBMS, dieser Code sieht überhaupt nicht wie ANSI SQL aus. – jarlh

+0

Markiert in der zweiten Zeile, die Prozedur wird die Daten in die Tabelle einfügen Ich habe Probleme, die letzte Inserts ID zurück zu bekommen – Stonesmit

+0

Willkommen bei stackoverflow. Bitte lesen [fragen]. –

Antwort

0

Der Grund ist die @new_ID Zuweisung wird nicht als Teil der Transaktion betrachtet; die INSERT Aussage ist. Bewegen Sie die folgende Zeile außerhalb des BEGIN ... END

SET @new_ID=SCOPE_IDENTITY(); 

Da Sie nur eine Operation in der Charge haben, können Sie verlieren die BEGIN...END

EDIT

Wie Thorsten Dittmar schlug ich brauche ein bisschen zu erklären des Weiteren. Die @new_ID Zuweisung wird sofort ausgeführt, da sie nicht als DML-Aktion betrachtet wird und nicht Teil des Stapels ist. Daher wird SCOPE_IDENTITTY() ausgeführt, aber es wird noch keine Identität generiert, da die INSERT-Anweisung als Teil des Stapels betrachtet wird und am Ende ausgeführt wird.

EDIT 2

Da die OP hinzugefügt MySQL Tag, obige Aussage wird nicht funktionieren, da keine SCOPE_IDENTITY() in MySQL ist da. Stattdessen ist die korrekte Funktion LAST_INSERT_ID().

SET @new_ID=LAST_INSERT_ID(); 
+0

Wie soll das helfen? –

+0

'SCOPE_IDENTITY()' gibt die letzte Identität eingefügt Einfügen wird nicht durchgeführt, bis die Charge geschlossen ist ... –

+0

Ich würde diesen Teil der Antwort denken, denkst du nicht –

Verwandte Themen