2012-10-05 16 views
11

Ich versuche, eine Prozedur von der Verwendung von sql plus zu mysql zu konvertieren, aber bekomme einen Syntaxfehler in der dritten Zeile, wo es heißt (W_IN IN NUMBER) und es hat IN als Syntaxfehler hervorgehoben. Plus-Erstellen einer Prozedur MySQL

SQL:

CREATE OR REPLACE PROCEDURE PRC_CUS_BALANCE_UPDATE (W_IN IN NUMBER) AS 
W_CUS NUMBER := 0; 
W_TOT NUMBER := 0; 
BEGIN 
-- GET THE CUS_CODE 
SELECT CUS_CODE INTO W_CUS 
FROM INVOICE 
WHERE INVOICE.INV_NUMBER = W_IN; 

-- UPDATES CUSTOMER IF W_CUS > 0 
IF W_CUS > 0 THEN 
    UPDATE CUSTOMER 
    SET CUS_BALANCE = CUS_BALANCE + 
       (SELECT INV_TOTAL FROM INVOICE WHERE INV_NUMBER = W_IN) 
    WHERE CUS_CODE = W_CUS; 
END IF; 
END; 

mySQL:

-- Trigger DDL Statements 
DELIMITER $$ 

CREATE PROCEDURE prc_cus_balance_update (W_IN IN NUMBER) 
AS 
W_CUS NUMBER = 0; 
W_TOT NUMBER = 0; 
BEGIN 
-- GET CUS_CODE 
SELECT CUS_CODE INTO W_CUS 
FROM INVOICE 
WHERE INVOICE.INV_NUMBER = W_IN; 

-- UPDATES CUSTOMER IF W_CUS > 0 
IF W_CUS > 0 THEN 
    UPDATE CUSTOMER 
    SET CUS_BALANCE = CUS_BALANCE + 
       (SELECT INV_TOTAL FROM INVOICE WHERE INV_NUMBER = W_IN) 
    WHERE CUS_CODE = W_CUS; 
END IF; 
END $$ 

DELIMITER ; 

Jede Hilfe ist sehr zu schätzen!

Antwort

22

Dies kompiliert in MySQL 5.5.23 zu sagen scheint:

-- Trigger DDL Statements 
DELIMITER $$ 

DROP PROCEDURE IF EXISTS prc_cus_balance_update; 

CREATE PROCEDURE prc_cus_balance_update (IN W_IN INT UNSIGNED) 
BEGIN 
DECLARE W_CUS INT UNSIGNED DEFAULT 0; 
DECLARE W_TOT DOUBLE DEFAULT 0; -- NOT USED? 
-- GET CUS_CODE 
SELECT CUS_CODE INTO W_CUS 
FROM INVOICE 
WHERE INVOICE.INV_NUMBER = W_IN; 

-- UPDATES CUSTOMER IF W_CUS > 0 
IF W_CUS > 0 THEN 
    UPDATE CUSTOMER 
    SET CUS_BALANCE = CUS_BALANCE + 
       (SELECT INV_TOTAL FROM INVOICE WHERE INV_NUMBER = W_IN) 
    WHERE CUS_CODE = W_CUS; 
END IF; 
END $$ 

DELIMITER ; 

Natürlich in diesem Fall wird eine gespeicherte Prozedur nicht werden, wie die folgende Abfrage benötigt führen Sie die gleiche Funktion viel schneller (und einfacher zu verstehen):

UPDATE 
    CUSTOMER c 
INNER JOIN 
    INVOICE i ON i.CUS_CODE = c.CUS_CODE 
SET 
    c.CUS_BALANCE = c.CUS_BALANCE + i.INV_TOTAL 
WHERE 
    i.INV_NUMBER = W_IN 
+0

Ah ok, ich verstehe. Vielen Dank!!! –

+0

Nachdem Sie $$ als Trennzeichen zugewiesen haben, müssen Sie dieses als Anweisungsende für den Drop-Befehl verwenden – Sayka

2

Der Doc

[ IN | OUT | INOUT ] param_name type 
Verwandte Themen