참고
MySQL Documentation
설명
- 에러를 리턴하도록 하는데 사용
- 에러의 error number, SQLSTATE value, message를 컨트롤 가능
- 만약 SIGNAL을 사용하지 않고 에러를 발생시키기 위해서는 의도적으로 존재하지 않는 테이블을 참조하도록 하는 방법을 사용한다.
- SIGNAL statement는 실행하는데 권한이 필요하지 않음
syntax
SIGNAL condition_value
[SET signal_information_item
[, signal_information_item] ...]
condition_value: {
SQLSTATE [VALUE] sqlstate_value
| condition_name
}
signal_information_item:
condition_information_item_name = simple_value_specification
condition_information_item_name: {
CLASS_ORIGIN
| SUBCLASS_ORIGIN
| MESSAGE_TEXT
| MYSQL_ERRNO
| CONSTRAINT_CATALOG
| CONSTRAINT_SCHEMA
| CONSTRAINT_NAME
| CATALOG_NAME
| SCHEMA_NAME
| TABLE_NAME
| COLUMN_NAME
| CURSOR_NAME
}
condition_name, simple_value_specification:
(see following discussion)
condition_value
- 리턴되는 error value를 나타낸다.
- SQLSTATE value 또는 DECALRE CONDITION으로 만들어진 condition_name이 사용될 수 있다.
- SQLSTATE value의 경우 00으로 시작하는 값은 올 수 없다(해당 값들은 성공으로 취급되기 때문)
- SQLSTATE value 45000의 경우 “unhandled user-defined exception.”을 의미하는 것으로 사용된다.
signal_information_item
- condition_information_item_name 항목 참조
condition_information_item_name
예시
CREATE PROCEDURE p (pval INT)
BEGIN
DECLARE specialty CONDITION FOR SQLSTATE '45000';
IF pval = 0 THEN
SIGNAL SQLSTATE '01000';
ELSEIF pval = 1 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred';
ELSEIF pval = 2 THEN
SIGNAL specialty
SET MESSAGE_TEXT = 'An error occurred';
ELSE
SIGNAL SQLSTATE '01000'
SET MESSAGE_TEXT = 'A warning occurred', MYSQL_ERRNO = 1000;
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An error occurred', MYSQL_ERRNO = 1001;
END IF;
END;