2016-05-28 7 views
1

トランザクションとストアドプロシージャについて学習し始めました。結果セットから値を変数に割り当てるさまざまな方法に慣れ親しんでいます。ここでDECLARE var_CurcId INT DEFAULT 0;トランザクションまたは変数の宣言エラー

上のエラーを引き起こしている可能性がありますどのような

は、私がこれまで行ってきたものです。

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurriculumWithSchoolYear`(IN p_subjectName varchar(50), IN p_yrLevel varchar(30), IN p_desc TEXT, IN p_creator varchar(20)) 
BEGIN 

    DECLARE hasError BOOL DEFAULT 0; 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1; 

    DECLARE var_CurcId INT DEFAULT 0; 
    DECLARE var_syStart INT DEFAULT 0; 
    DECLARE var_syEnd INT DEFAULT 0; 

     START TRANSACTION; 

     -- 1 insert statement to curriculum table 
      INSERT INTO curriculum(`name`,`yearLevel`,`description`,`creator`) 
      VALUES(p_subjectName,p_yrLevel,p_desc,p_creator); 
     -- 2 insert statement to schoolyearcurriculum table 

      INSERT INTO schoolyearcurriculums(curriculumId,syStart,syEnd) 
      VALUES(var_CurcId,var_syStart,var_syEnd); 

     IF `hasError` THEN 
      ROLLBACK; -- if error occurs to any of the insert, select statements above, undo it 
     ELSE 
      COMMIT; -- if all insert, select statement is successful, execute. 
      SELECT 'Successfully Inserted Information'; 
     END IF; 
END; 

var_CurcId変数の宣言にerorrので、私はあなたが私を助けることを願って、私はこれに新たなんだSyntax error: unexpected 'var_CurcId' (identifier)

を言っています。私はまだ:=演算子とselect intosetのような異なる方法を試しています。

ご協力いただきありがとうございます。

ありがとうございました。

答えて

1

これは少しトリッキーです。すべての宣言をハンドラの前に置いてください。

CREATE PROCEDURE `addCurriculumWithSchoolYear`(IN p_subjectName varchar(50), IN p_yrLevel varchar(30), IN p_desc TEXT, IN p_creator varchar(20)) 
BEGIN 
    DECLARE hasError BOOL DEFAULT 0; 
    DECLARE var_CurcId INT DEFAULT 0; 
    DECLARE var_syStart INT DEFAULT 0; 
    DECLARE var_syEnd INT DEFAULT 0; 

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1; 

END 

HereはSQL Fiddleです。

BEGIN/ENDブロックでは、すべてDECLAREが最初のステートメントでなければなりません。通常、ハンドラは変数宣言の後ろにあります。しかし、それがテストされるまで、これが必要であることはわかりませんでした。

+0

ありがとうございました。あなたはそれを解決しました!私はHandlerが変数宣言をしなければならないことは知らなかった。私はすべてのDECLAREステートメントはどこにでも置くことができると思った。私は助けに感謝します。もう一つの学習が私の知識に加わりました。 – p3ace