2016-06-07 7 views
0

Ich möchte unter gespeicherten Prozedur ausführen, aber es gibt mir einen Fehler. In Flag 1 nach dem Aktualisieren der Auftragstabelle möchte ich eine andere Bedingung überprüfen und wenn das wahr ist, dann möchte ich eine weitere Aktualisierungsabfrage ausführen. Ich versuchte dies in SQL Server mit temporären Tabellen und es funktionierte. Bitte hilf mir.verschachtelt IF ELSE in MySQL

Fehler ist unten:

Script Zeile: 4 Sie haben einen Fehler in der SQL-Syntax; das Handbuch , die für die richtige Syntax zu Verwendung in der Nähe von 'FROM Produkt PR INNER JOIN (SELECT PR.ID AS ProductID (PR.Quantity - OD.Qu' auf Ihre MySQL-Server-Version entspricht in Zeile 35

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `onlineshop`.`USP_Public_SaveOrder` $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_Public_SaveOrder`(IN pint_Flag INT,INOUT pint_ID BIGINT,IN pint_Status INT,IN pint_CustomerID BIGINT,IN pint_ShippingAddressID BIGINT,IN pint_BillingAddresID BIGINT, IN pdec_ShippingCharge DECIMAL(18,2),IN pdec_Tax DECIMAL(18,2),IN pdec_Total DECIMAL(18,2),IN pdte_TransactionDate DATETIME) 
BEGIN 
IF(pint_Flag=0) THEN 
    INSERT INTO orderheader(Status, 
              CustomerID, 
              ShippingAddressID, 
              BillingAddressID, 
              ShippingCharge, 
              Tax, 
              Total, 
              TransactionDate) 
          VALUES (pint_Status, 
              pint_CustomerID, 
              pint_ShippingAddressID, 
              pint_BillingAddresID, 
              pdec_ShippingCharge, 
              pdec_Tax, 
              pdec_Total, 
              pdte_TransactionDate); 
     SET pint_ID=LAST_INSERT_ID(); 

ELSEIF(pint_Flag=1) THEN 
    UPDATE orderheader 
    SET  Status = pint_Status, 
       CustomerID = pint_CustomerID, 
       ShippingAddressID = pint_ShippingAddressID, 
       BillingAddressID = pint_BillingAddresID, 
       ShippingCharge = pdec_ShippingCharge, 
       Tax = pdec_Tax, 
       Total = pdec_Total, 
       TransactionDate = pdte_TransactionDate 
    WHERE ID=pint_ID; 
    IF(pint_Status=2) THEN 
    UPDATE product SET Quantity = A.remain 
    FROM product PR 
    INNER JOIN (SELECT PR.ID AS ProductID, (PR.Quantity - OD.Quantity) AS remain 
       FROM product P 
       INNER JOIN orderdetail OD ON OD.ProductID = P.ID AND OD.OrderID = pint_ID) A ON PR.ID = A.ProductID 
    ELSE 
    RETURN 
    END IF; 
END IF; 
END $$ 

DELIMITER ; 
+0

Sie scheinen ein Semikolon vor dem letzten "ELSE" zu fehlen. – Jocelyn

+0

Ich habe ein Semikolon hinzugefügt. aber immer noch den gleichen Fehler – user2837480

Antwort

1

ändern sie bitte Ihre UPDATE Block wie folgt und versuchen sie es

IF(pint_Status=2) THEN 
    UPDATE product PR 
    INNER JOIN (SELECT PR.ID AS ProductID, (PR.Quantity - OD.Quantity) AS remain 
       FROM product P 
       INNER JOIN orderdetail OD ON OD.ProductID = P.ID AND OD.OrderID = pint_ID 
       ) A ON PR.ID = A.ProductID 
    SET PR.Quantity = A.remain; 
ELSE 
    RETURN 
END IF; 
+0

ich habe es hinzugefügt. aber ich bekomme den gleichen Fehler :( – user2837480

+0

Könnten Sie versuchen, die aktualisierte Antwort – Arulkumar

+0

scheint seine Arbeit. Ich habe eine RETURN in anderen Teil geschrieben. Also diese Zeit Problem ist das. Eigentlich brauche ich sonst nicht Teil hier. Kann ich nur das sonst entfernen aus dem code ...? oder was soll ich sonst noch hier schreiben ... danke für deine hilfe :) – user2837480

1

überprüfen sie die Syntax der Anweisung UPDATE:.. 14.2.11 UPDATE Syntax

. 
. 
. 
UPDATE product SET Quantity = A.remain 
FROM product PR 
    INNER JOIN (SELECT PR.ID AS ProductID, (PR.Quantity - OD.Quantity) AS remain 
       FROM product P 
       INNER JOIN orderdetail OD ON 
        OD.ProductID = P.ID AND 
        OD.OrderID = pint_ID 
      ) A ON PR.ID = A.ProductID -- ; <- Add semicolon 
. 
. 
. 
/*ELSE 
    RETURN*/ 

Gespeicherte Prozeduren benötigen keine RETURN.

1

Die Syntax UPDATE von MySQL verwendet das Schlüsselwort FROM nicht. Wenn Sie einen Alias ​​für die zu aktualisierende Tabelle angeben möchten, fügen Sie ihn einfach hinter die -Klausel ein. Und in Ihrer Unterabfrage sollten Sie den Alias ​​P, nicht PR verwenden.

UPDATE PRODUCT AS PR 
INNER JOIN (SELECT P.ID AS ProductID, (P.Quantity - OD.Quantity) AS remain 
      FROM product P 
      INNER JOIN orderdetail OD ON OD.ProductID = P.ID AND OD.OrderID = pint_ID) A ON PR.ID = A.ProductID 
SET PR.Quantity = A.remain 

Es gibt eigentlich keine Notwendigkeit, die Unterabfrage zu verwenden, kommen nur PRODUCT mit orderdetail direkt.

UPDATE PRODUCT AS PR 
INNER JOIN orderdetail AS OD ON OD.ProductID = PR.ID 
SET PR.Quantity = PR.Quantity - OD.Quantity 
WHERE OD.OrderID = pintID 
+0

ich bin neu zu mySql. zuvor habe ich sqlserver benutzt. Daher habe ich weniger Kenntnisse in der MySQL-Syntax. Ihre Abfrage funktioniert. Danke dafür :) – user2837480

+0

Ändern 'P.ID' durch' PR.ID'. – wchiquito

+0

Danke, ich dachte ich habe sie alle erwischt. – Barmar