2016-07-15 9 views
1
CREATE PROCEDURE test_proc (in name varchar(100),out return_msg varchar(3000))            
BEGIN 
    BEGIN 
     DECLARE v_return_msg VARCHAR(3000); -- return message 
     DECLARE v_error_flag INT DEFAULT 0; 
     DECLARE EXIT HANDLER FOR SQLEXCEPTION SET v_error_flag = -1; 

     START TRANSACTION; 

     INSERT INTO `tablename` (name, value) VALUES (name, 'Test2'); 
    END; 

    IF v_error_flag < 0 THEN 
     ROLLBACK; 
     CALL DBMS_OUTPUT.PUT_LINE('Error : ' || mysql_error); 
     SELECT * FROM INSERT_INFO; -- UPDATE_TABLE_USED 
     SHOW ERRORS; 
    ELSE 
     COMMIT; 
     CALL DBMS_OUTPUT.PUT_LINE('Sucess : ' || sqlerrm); 
     SELECT 'Process succeed!!!'; 
    END IF; 
END 

これは私のmysqlクエリ(手順)です。それは#1054エラーが発生しました。私はmysqlのプロシージャを呼び出すとき

ただし、プロシージャを呼び出すと、エラーが発生します。

MySQLのメッセージ:#1054 - 'フィールドリスト' 内の不明な列 'v_error_flag'

文がエラーを発生した場合、私は思います。

IF v_error_flag < 0 THEN 

しかし、私はそれをどのように修正できるかわかりません。

答えて

2

v_error_flagは、BEGIN ... ENDで宣言されています。

条件がブロック外のため、v_error_flagが認識されず、エラーがスローされます。

BEGIN ... ENDブロック内でIF v_error_flag < 0 THENの条件を移動する必要があります。

または

単にBEGINセカンドを削除したり、コメント... ENDブロックとして:

CREATE PROCEDURE test_proc (in name varchar(100),out return_msg varchar(3000))            
BEGIN 
    -- BEGIN <-- remove/comment this 
    DECLARE v_return_msg VARCHAR(3000); -- return message 
    DECLARE v_error_flag INT DEFAULT 0; 
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SET v_error_flag = -1; 

    START TRANSACTION; 

    INSERT INTO `tablename` (name, value) VALUES (name, 'Test2'); 
    -- END; <-- remove/comment this 

    IF v_error_flag < 0 THEN 
      ROLLBACK; 
      CALL DBMS_OUTPUT.PUT_LINE('Error : ' || mysql_error); 
      SELECT * FROM INSERT_INFO; -- UPDATE_TABLE_USED 
      SHOW ERRORS; 
    ELSE 
      COMMIT; 
      CALL DBMS_OUTPUT.PUT_LINE('Sucess : ' || sqlerrm); 
      SELECT 'Process succeed!!!'; 
    END IF; 
END 
+0

答えていただきありがとうございます。今、私の手技がなぜ機能しなかったのか理解しています。 :) – YouHoGeon

関連する問題