2012-10-05 10 views
11

プロシージャをsql plusからmysqlに変換しようとしていますが、3番目の行(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

を言っているようだ:

もちろん
-- 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これはMySQLの5.5.23でコンパイル

[ IN | OUT | INOUT ] param_name type