본문 바로가기
MySql

MySQL에서 유효하지 않은 오류 처리기를 선언 하시겠습니까?

by 베이스 공부 2020. 12. 3.
반응형

오류 처리기를 사용하는 첫 번째 저장 프로 시저를 작성하려고하는데 내 구문을 받아들이지 않는 것 같습니다. 내가 사용하는 것은 다음과 같습니다.

DELIMITER //

CREATE PROCEDURE min_list_valid (OUT pass CHAR
                                ,OUT errs VARCHAR(50)
                                ,IN `@list_id` INT
                                ,IN `@min_input` INT)
BEGIN
    BEGIN
        DROP TABLE IF EXISTS `errors_table`;
        CREATE TEMPORARY TABLE `errors_table`(error VARCHAR(30))ENGINE=MEMORY;
    END;

    BEGIN
        DECLARE error_holder VARCHAR(30);
        DECLARE error_checker VARCHAR(30);
        SET error_checker = 0;

        DECLARE CONTINUE HANDLER FOR SQLSTATE, SQLEXCEPTION
        BEGIN
            SELECT 'The user input is less than the minimum for this list' INTO error_holder;
            SELECT error_holder INTO `errors_table`;
            SET error_checker = 1;
        END;

        SELECT      IF(MAX(CAST(`peg_num` AS UNSIGNED))<`@min_input`,'pass',NULL) AS `key`
        FROM        `game_lists`
        WHERE       `list_id` = `@list_id`
        INTO        pass;

        IF error_checker <> 0 THEN
            SELECT * FROM `errors_table`
        END IF;
    END;
END; //

오류 메시지를 돌려줍니다.

# 1064-SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 16 행의 'DECLARE CONTINUE HANDLER FOR SQLSTATE, SQLEXCEPTION BEGIN'근처에서 사용할 올바른 구문을 확인하십시오.

하지만 이상하게도 선언이 잘못되었지만 오류가 발생한 줄은 16 번째 줄 ( SET error_checker = 0 인 줄)입니다. 나는 내가 올바른 구문을 따르고 있다고 믿습니다. 그래서 ... 무엇이 잘못 되었나요?

이 저장된 proc이하는 일은 목록에서 최대 값을 선택하는 것이며, 다른 모든 것은 생성 된 오류를 저장하기 위해 오류 처리기와 오류 테이블을 만들려고하는 것뿐입니다. 디버그 지점이 너무 많지 않도록 먼저 "완전한"오류 처리로 간단한 기능을 시도하고 싶었습니다.

내 MySQL 버전은 5.6.14입니다-MySQL Community Server (GPL)

 

해결 방법

 

수정 된 절차는 다음과 같습니다. 아래에 지적한 몇 가지 실수

DELIMITER //
CREATE PROCEDURE min_list_valid (OUT pass CHAR
                                ,OUT errs VARCHAR(50)
                                ,IN `@list_id` INT
                                ,IN `@min_input` INT)
BEGIN
        DECLARE error_holder VARCHAR(30); <--Move this declare statement above here
        DECLARE error_checker VARCHAR(30);
        SET error_checker = 0;
    BEGIN
        DROP TABLE IF EXISTS `errors_table`;
        CREATE TEMPORARY TABLE `errors_table`(`error` VARCHAR(30))ENGINE=MEMORY; 

END;

BEGIN <-- after begin you should declare only the error handler
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000', SQLEXCEPTION
                                            <-- Provide a valid SQL State                                
    BEGIN
        SELECT 'The user input is less than the minimum for this list' INTO error_holder;
        INSERT INTO `errors_table`(`error`) SELECT error_holder;
        SET error_checker = 1;
    END;

    SELECT      CASE WHEN MAX(CAST(`peg_num` AS UNSIGNED)) < @min_input THEN 'pass'
                ELSE NULL END AS `key`
    FROM        `game_lists`
    WHERE       `list_id` = `@list_id`
    INTO        pass;

    IF error_checker <> 0 THEN
        SELECT * FROM `errors_table`;
    END IF;
END;
END; //

 

참조 페이지 https://stackoverflow.com/questions/25102094

 

 

반응형

댓글