MySQL 함수 내에서 오류를 발생시키는 방법
MySQL 함수를 만들었으며 매개 변수에 전달 된 값이 유효하지 않은 경우 오류를 발생시키고 싶습니다. MySQL 함수 내에서 오류를 발생시키는 옵션은 무엇입니까?
MySQL 5.5에는 다른 언어의 예외와 유사한 신호가 도입되었습니다.
http://dev.mysql.com/doc/refman/5.5/en/signal.html
예를 들어, mysql
명령 줄 클라이언트에서 :
mysql> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error';
ERROR 1644 (45000): Custom error
실제로 세 가지 답변의 조합입니다. 존재하지 않는 프로 시저를 호출하여 오류를 발생시킨 다음 생성 한 오류를 포착하는 종료 핸들러를 선언합니다. 다음은 삭제할 행에 외래 키 ID가 설정된 경우 SQLSTATE 42000 (프로 시저가 존재하지 않음)을 사용하여 삭제하기 전에 오류를 발생시키는 예입니다.
DROP PROCEDURE IF EXISTS decount_test;
DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint )
DETERMINISTIC MODIFIES SQL DATA
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '42000'
SELECT 'Invoiced barcodes may not have accounting removed.';
IF (SELECT invoice_id
FROM accounted_barcodes
WHERE id = p_id
) THEN
CALL raise_error;
END IF;
DELETE FROM accounted_barcodes WHERE id = p_id;
END //
DELIMITER ;
산출:
call decount_test(123456);
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
왜 VARCHAR
선언 된 INTEGER
변수 에 저장하지 않습니까?
DELIMITER $$ DROP FUNCTION IF EXISTS `raise_error` $$
CREATE FUNCTION `raise_error`(MESSAGE VARCHAR(255))
RETURNS INTEGER DETERMINISTIC BEGIN
DECLARE ERROR INTEGER;
set ERROR := MESSAGE;
RETURN 0;
END $$ DELIMITER ;
-- set @foo := raise_error('something failed'); -- or within a query
오류 메시지는 다음과 같습니다.
잘못된 정수 값 : 1 행의 'ERROR'열에 대한 'something failed'
완벽하지는 않지만 매우 설명적인 메시지를 제공하고 확장 DLL을 작성할 필요가 없습니다.
MySQL 5에서는 존재하지 않는 저장 프로 시저를 호출하거나 (CALL raise_error) 잘못된 값을 쿼리에 전달 (예 : NOT NULL 제한 필드에 대한 null)하여 오류를 발생시킬 수 있습니다. 다음은 MySQL 함수 내에서 오류 발생에 대한 Roland Bouman의 흥미로운 게시물입니다.
http://rpbouman.blogspot.com/2005/11/using-udf-to-raise-errors-from-inside.html
유효하지 않은 수의 인수를 사용하여 기존 함수를 호출 할 수도 있습니다.
예외 처리기를 정의해야합니다. http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html을 살펴보십시오.
참고URL : https://stackoverflow.com/questions/465727/how-to-raise-an-error-within-a-mysql-function
'Programing' 카테고리의 다른 글
NHibernate의 성능을 향상시키는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.01 |
---|---|
화면을 비트 맵으로 캡처 (0) | 2020.12.01 |
단위 테스트 임베디드 소프트웨어 (0) | 2020.12.01 |
Linux 기반 (공유 호스팅) 웹 서버에 wkhtmltopdf를 설치하는 방법 (0) | 2020.12.01 |
푸시 된 태그가 git 원격에 있는지 확인 (0) | 2020.12.01 |