2016-09-09 32 views
0

私はすべての構文がOKですが、私はエラーが表示されるようです。トリガーの作成:ERROR 1064(42000):SQL構文にエラーがあります。

注:mysqlコンソールにこのコードを貼り付けることで、トリガーを作成しています。これが重要かどうかはわかりません。以下は

DELIMITER $$ 
CREATE TRIGGER after_nse_fo_insert AFTER INSERT 
ON NSE_FO 
FOR EACH ROW 
BEGIN 
DECLARE settle_orders_data VARCHAR(1000) DEFAULT ''; 
DECLARE delimiter_pos INT DEFAULT 0; 
DECLARE start_pos INT DEFAULT 0; 
DECLARE fill_id VARCHAR(50) DEFAULT ''; 
DECLARE if_settled VARCHAR(50) DEFAULT ''; 
DECLARE units_settled INT DEFAULT 0; 
DECLARE temp_diff INT DEFAULT 0; 

CALL settle_trade_orders(NEW.FillId, NEW.SymbolName, NEW.TransactionType, NEW.AccountName, NEW.TradeDateTime, CAST(NEW.FillSize AS UNSIGNED), NEW.FillPrice, settle_orders_data); 

settling_loop: LOOP 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 

IF delimiter_pos = 0 THEN 
    LEAVE settling_loop; 
END IF; 

SET temp_diff = delimiter_pos - start_pos; 
SET fill_id = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 
SET temp_diff = delimiter_pos - start_pos; 
SET if_settled = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 
SET temp_diff = delimiter_pos - start_pos; 
SET settled_count = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

-- settle in NSE_FO table 
-- UPDATE NSE_FO 
-- SET Settled=if_settled, settled_units=settled_count 
-- WHERE FillId=fill_id; 
END LOOP settling_loop; 

END $$ 
DELIMITER ; 

私は

ERROR 1064(42000)を参照のエラーです:あなたは、あなたのSQL構文でエラーが発生しているが、正しい の構文が 'IFの近くで使用するようにMySQLサーバのバージョンに対応する マニュアルを確認してください。

SET temp_diff = delimiter_pos - start_pos; fill_id SETは= SUBSTRING(ライン19

でsettle_o」私はそれらの線の周りの構文の問題が何であるかわからない

更新:?。完全IF文を削除は、別のエラーがスローされます

ERROR 1064(42000):SQL構文にエラーがあります。 構文が近くに使用されるようにMySQLサーバのバージョンに対応する のマニュアルをチェックしてください '(settle_orde rs_data、start_pos、temp_diff); SET start_pos = delimiter_pos + 1; 17行目でIFを完全に削除しました。

+0

。全く同じ結果。 – bobdiya

答えて

1

最後の回答は完全に間違ったツリーを吠えていたので、私はそれを削除しました。

このコードはエラーなしで私のために実行されます。私はあなたがDROP NSE_FOを偶然にも欲しくないので、コメント文に注意してください。

編集:これは、テキストエディタとコンソールの間でコピー/ペーストエラーが発生したようです。これがどのように発生したかはわかりませんが、私はNotepad++(Windows版)が過去に非常に安定していることがわかりました。

よろしく、私はそれを削除して、再度トリガーを作成しようとしました@Stivan

ジェームズ

USE test; 

/* 
DROP TABLE IF EXISTS NSE_FO; 
CREATE TABLE NSE_FO (FillId BIT, SymbolName BIT, TransactionType BIT, AccountName BIT, TradeDateTime BIT, FillSize BIT, FillPrice BIT); 
*/ 

DROP TRIGGER IF EXISTS after_nse_fo_insert; 

DELIMITER $$ 
CREATE TRIGGER after_nse_fo_insert AFTER INSERT 
ON NSE_FO 
FOR EACH ROW 
BEGIN 
DECLARE settle_orders_data VARCHAR(1000) DEFAULT ''; 
DECLARE settled_count VARCHAR(1000) DEFAULT ''; 
DECLARE delimiter_pos INT DEFAULT 0; 
DECLARE start_pos INT DEFAULT 0; 
DECLARE fill_id VARCHAR(50) DEFAULT ''; 
DECLARE if_settled VARCHAR(50) DEFAULT ''; 
DECLARE units_settled INT DEFAULT 0; 
DECLARE temp_diff INT DEFAULT 0; 

CALL settle_trade_orders(NEW.FillId, NEW.SymbolName, NEW.TransactionType, NEW.AccountName, NEW.TradeDateTime, CAST(NEW.FillSize AS UNSIGNED), NEW.FillPrice, settle_orders_data); 

settling_loop: LOOP 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 

IF delimiter_pos = 0 THEN 
    LEAVE settling_loop; 
END IF; 

SET temp_diff = delimiter_pos - start_pos; 
SET fill_id = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 
SET temp_diff = delimiter_pos - start_pos; 
SET if_settled = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

SET start_pos = delimiter_pos + 1; 
SET delimiter_pos = LOCATE(',', settle_orders_data, start_pos); 
SET temp_diff = delimiter_pos - start_pos; 
SET settled_count = SUBSTRING(settle_orders_data, start_pos, temp_diff); 

-- settle in NSE_FO table 
-- UPDATE NSE_FO 
-- SET Settled=if_settled, settled_units=settled_count 
-- WHERE FillId=fill_id; 
END LOOP settling_loop; 

END $$ 
DELIMITER ; 
+0

私はそれを試みた。別のエラーが表示されます。 'ERROR 1064(42000):あなたはSQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文が '(settle_orders_data、start_pos、temp_diff)の近くで使用されるようにしてください。 SET start_pos = delimiter_pos + 1; 'at line 17'です。 IFを完全に削除しました。それでも上記のエラーは続く。 – bobdiya

+0

お詫び申し上げます、私の答えは完全に間違っていました。変数 'settled_count'を定義してストアドプロシージャを使って行を削除すると、私の側でトリガを作成できます。プロシージャの周りのコードを見てみましょう。 –

+0

私の答えを –

関連する問題