반응형
오류 처리기를 사용하는 첫 번째 저장 프로 시저를 작성하려고하는데 내 구문을 받아들이지 않는 것 같습니다. 내가 사용하는 것은 다음과 같습니다.
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
반응형
'MySql' 카테고리의 다른 글
MySQL Mysql Workbench에서 0 또는 1 대 다 관계를 만드는 방법 (0) | 2020.12.03 |
---|---|
MySQL 임의의 데이터로 1000000 행을 생성하는 방법은 무엇입니까? (0) | 2020.12.03 |
MySQL SQL 덤프는 무엇입니까? (0) | 2020.12.03 |
MySQL Node-MySQL-Query () 메서드에서 이스케이프 vs Mysql.Escape () / Mysql.EscapeId () (0) | 2020.12.03 |
MySQL에서 빈 문자열 삽입을 방지하기위한 제약 (0) | 2020.12.03 |
댓글