Programing

MySQL 함수 내에서 오류를 발생시키는 방법

crosscheck 2020. 12. 1. 07:42
반응형

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

반응형