2012-10-05 28 views
11

我试图转换一个程序从使用sql plus到mysql,但在第三行中出现语法错误(W_IN IN NUMBER)并且IN突出显示为语法错误。创建一个程序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 ; 

任何帮助,不胜感激!

回答

22

这将编译在MySQL 5.5.23:

-- 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 ; 

当然,在这种情况下,不需要存储过程,如下面的查询将执行相同的功能要快得多(并且更容易理解):

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

好吧,我明白了。谢谢!!! –

+0

将$$指定为分隔符后,必须将该语句结束为Drop – Sayka

2

doc文件似乎在说

[ IN | OUT | INOUT ] param_name type