13.6.7.5 SIGNAL 구문
SIGNALcondition_value
[SETsignal_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_NAMEcondition_name
,simple_value_specification
: (see following discussion)
SIGNAL
오류 "반환"방법입니다. SIGNAL
은 핸들러 응용 프로그램의 바깥 부분 또는 클라이언트에 오류 정보를 제공합니다. 또한 오류의 특성 (오류 번호 SQLSTATE
값, 메시지)에 대한 제어도 제공합니다. SIGNAL
을 사용하지 않는 경우는 존재하지 않는 테이블을 의도적으로 참조 루틴이 오류를 반환하는 등의 해결 방법에 의존해야합니다. SIGNAL
문을 실행하는 데 특별한 권한이 필요하지 않습니다.
진단 영역에서 정보를 검색하려면 GET DIAGNOSTICS
문을 사용합니다 ( 섹션 13.6.7.3 "GET DIAGNOSTICS 구문" 을 참조하십시오). 진단 영역은 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오.
SIGNAL
문에서 condition_value
는 반환 된 오류 값을 보여줍니다. 이것은 SQLSTATE
값 (5 문자열 리터럴)하거나 이전에 DECLARE ... CONDITION
에 정의 된 명명 된 조건을 참조 condition_name
할 수 있습니다 ( 섹션 13.6.7.1 "DECLARE ... CONDITION 구문 " 을 참조하십시오).
SQLSTATE
값은 오류, 경고 또는 "없음"을 나타내는 경우가 있습니다. 섹션 13.6.7.5.1 "신호 조건 정보 항목" 에 설명 된대로이 값의 처음 두 문자는 그 오류 클래스를 나타냅니다. 일부 신호 값은 문을 종료합니다. 섹션 13.6.7.5.2 "핸들러 커서 및 문에 대한 신호의 영향" 을 참조하십시오.
'00'
은 성공을 나타내고 에러의 통지는 유효하지 않기 때문에, SIGNAL
문 SQLSTATE
값을 같은 값으로 시작해야하지 않습니다. 이것은 SQLSTATE
값이 SIGNAL
문에서 직접 또는이 문에서 참조되는 명명 된 조건으로 명기되어있는 경우에도 마찬가지입니다. 이 값이 무효 인 경우는 Bad SQLSTATE
오류가 발생합니다.
일반적인 SQLSTATE
값을보고는 '45000'
을 사용합니다. 이것은 "처리되지 않은 사용자 정의 예외"를 나타냅니다.
SIGNAL
문에 선택적으로 여러 신호 항목이 condition_information_item_name
= simple_value_specification
대입 쉼표로 구분 된 목록에 포함되어있는 SET
절이 있습니다.
각 condition_information_item_name
은 SET
절에서 한 번만 지정할 수 있습니다. 그렇지 않은 경우는 Duplicate condition information item
오류가 발생합니다.
유효한 simple_value_specification
지시자는 저장 프로 시저 또는 저장 함수의 매개 변수 DECLARE
에서 선언 된 프로 프로그램의 로컬 변수 사용자 정의 변수 시스템 변수 또는 리터럴을 사용하여 지정할 수 있습니다. 문자 리터럴은 _charset
인트로 듀서를 포함 할 수 있습니다.
허용되는 condition_information_item_name
값은 섹션 13.6.7.5.1 "신호 조건 정보 항목" 을 참조하십시오.
다음 프로시 저는 입력 매개 변수 인 pval
의 값에 따라 에러 또는 경고를 알립니다.
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;
pval
가 0이면 '01'
로 시작하는 SQLSTATE
값은 경고 클래스의 신호이기 때문에 p()
는 경고를 알립니다. 이 경고는 프로 시저를 종료하지 않고 프로 시저에서 돌아온 뒤에 SHOW WARNINGS
에서 확인할 수 있습니다.
pval
가 1이면 p()
는 오류를 통지하고 MESSAGE_TEXT
조건 정보 항목을 설정합니다. 이 오류는 프로 시저를 종료하고 그 텍스트가 오류 정보와 함께 반환됩니다.
pval
가 2 인 경우,이 경우 명명 된 조건을 사용하여 SQLSTATE
값이 지정되어 있음에도 불구하고 같은 에러가 통지됩니다.
pval
가 다른 임의의 값이면 p()
는 처음에 경고를 통지 메시지 텍스트 및 오류 번호 조건 정보 항목을 설정합니다. 이 경고는 프로 시저를 종료시키지 않기 때문에 실행이 계속되고, 그 후에 p()
는 오류를 통지합니다. 이 오류는 프로 시저를 종료합니다. 경고에 의해 설정된 메시지 텍스트 및 오류 번호 오류에 의해 설정된 값으로 대체 그것이 오류 정보와 함께 반환됩니다.
SIGNAL
은 일반적으로 저장 프로그램에서 사용되지만,이 핸들러의 컨텍스트 외부에서 허용되는 MySQL 확장입니다. 예를 들어, mysql 클라이언트 프로그램을 호출하는 경우 프롬프트에서 다음 명령 중 하나를 입력 할 수 있습니다.
mysql>SIGNAL SQLSTATE '77777';
mysql>CREATE TRIGGER t_bi BEFORE INSERT ON t
->FOR EACH ROW SIGNAL SQLSTATE '77777';
mysql>CREATE EVENT e ON SCHEDULE EVERY 1 SECOND
->DO SIGNAL SQLSTATE '77777';
SIGNAL
은 다음 규칙에 따라 실행됩니다.
SIGNAL
문이 특정 SQLSTATE
값을 나타내는 경우, 그 값은 지정된 조건을 알리기 위해 사용됩니다. 예 :
CREATE PROCEDURE p (divisor INT) BEGIN IF divisor = 0 THEN SIGNAL SQLSTATE '22012'; END IF; END;
SIGNAL
문이 명명 된 조건을 사용하는 경우, 그 조건은 SIGNAL
문에 적용되는 어떠한 범위 내에서 선언 될 필요가 있으며 MySQL 오류 번호가 아닌 SQLSTATE
값을 사용하여 정의 될 필요가 있습니다. 예 :
CREATE PROCEDURE p (divisor INT) BEGIN DECLARE divide_by_zero CONDITION FOR SQLSTATE '22012'; IF divisor = 0 THEN SIGNAL divide_by_zero; END IF; END;
명명 된 조건이 SIGNAL
문 범위 내에없는 경우는 Undefined CONDITION
오류가 발생합니다.
SIGNAL
이 SQLSTATE
값 대신 MySQL 오류 번호에 정의 된 명명 된 조건을 참조하는 경우, SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE
오류가 발생합니다. 다음 문을 실행하면 명명 된 조건이 MySQL 오류 번호와 관련된 있기 때문에 오류가 발생합니다.
DECLARE no_such_table CONDITION FOR 1051; SIGNAL no_such_table;
특정 이름을 가지는 조건이 다른 범위에서 여러 번 선언되는 경우 가장 로컬 범위의 선언이 적용됩니다. 다음 프로 시저를 생각해 보겠습니다.
CREATE PROCEDURE p (divisor INT) BEGIN DECLARE my_error CONDITION FOR SQLSTATE '45000'; IF divisor = 0 THEN BEGIN DECLARE my_error CONDITION FOR SQLSTATE '22012'; SIGNAL my_error; END; END IF; SIGNAL my_error; END;
divisor
가 0 인 경우는 첫 번째 SIGNAL
문이 실행됩니다. 가장 안쪽의 my_error
조건 선언이 적용되고 SQLSTATE
'22012'
이 발생합니다.
divisor
가 0이 아닌 경우는 2 번째 SIGNAL
문이 실행됩니다. 가장 바깥 쪽 my_error
조건 선언이 적용되고 SQLSTATE
'45000'
이 발생합니다.
조건이 발생했을 때 서버가 핸들러를 선택하는 방법은 섹션 13.6.7.6 "핸들러의 범위에 관한 규칙" 을 참조하십시오.
신호가 예외 핸들러 내에서 발생하는 경우가 있습니다.
CREATE PROCEDURE p () BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SIGNAL SQLSTATE VALUE '99999' SET MESSAGE_TEXT = 'An error occurred'; END; DROP TABLE no_such_table; END;
CALL p()
가 DROP TABLE
문에 도달합니다. no_such_table
라는 테이블이 존재하지 않기 때문에 오류 핸들러가 활성화됩니다. 오류 핸들러는 원래 오류 ( "이 같은 테이블이 없다")을 파기하고 SQLSTATE
'99999'
의 새로운 오류 및 메시지 An error occurred
을 만듭니다.
13.6.7.5.1 신호 조건 정보 항목
다음 표는 SIGNAL
(또는 RESIGNAL
) 문에서 설정할 수있는 진단 영역 조건 정보 항목의 이름을 나열하고 있습니다. MySQL 확장이다 MYSQL_ERRNO
을 제외한 모든 항목이 표준 SQL입니다. 이 항목의 자세한 내용은 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오.
Item Name Definition --------- ---------- CLASS_ORIGIN VARCHAR(64) SUBCLASS_ORIGIN VARCHAR(64) CONSTRAINT_CATALOG VARCHAR(64) CONSTRAINT_SCHEMA VARCHAR(64) CONSTRAINT_NAME VARCHAR(64) CATALOG_NAME VARCHAR(64) SCHEMA_NAME VARCHAR(64) TABLE_NAME VARCHAR(64) COLUMN_NAME VARCHAR(64) CURSOR_NAME VARCHAR(64) MESSAGE_TEXT VARCHAR(128) MYSQL_ERRNO SMALLINT UNSIGNED
문자 항목의 문자 세트는 UTF-8입니다.
SIGNAL
문에서 조건 정보 항목에 NULL
을 할당 할 수 없습니다.
SIGNAL
문은 직접 또는 SQLSTATE
값으로 정의 된 명명 된 조건을 참조하여 간접적으로 여부에 관계없이 항상 SQLSTATE
값을 지정합니다. SQLSTATE
값의 처음 두 문자는 그 클래스이며,이 클래스는 그 조건 정보 항목의 기본값이 결정됩니다.
클래스 =
'00'
(성공)부정합니다.
'00'
로 시작하는SQLSTATE
값은 성공을 보여주기 위해SIGNAL
에는 유효하지 않습니다.클래스 =
'01'
(경고)MESSAGE_TEXT = 'Unhandled user-defined warning condition'; MYSQL_ERRNO =
ER_SIGNAL_WARN
클래스 =
'02'
(없음)MESSAGE_TEXT = 'Unhandled user-defined not found condition'; MYSQL_ERRNO =
ER_SIGNAL_NOT_FOUND
클래스>
'02'
(예외)MESSAGE_TEXT = 'Unhandled user-defined exception condition'; MYSQL_ERRNO =
ER_SIGNAL_EXCEPTION
정당한 클래스의 경우 다른 조건 정보 항목을 다음과 같이 설정됩니다.
CLASS_ORIGIN = SUBCLASS_ORIGIN = ''; CONSTRAINT_CATALOG = CONSTRAINT_SCHEMA = CONSTRAINT_NAME = ''; CATALOG_NAME = SCHEMA_NAME = TABLE_NAME = COLUMN_NAME = ''; CURSOR_NAME = '';
SIGNAL
이 실행 된 후에 액세스 할 수있는 오류 값은 SIGNAL
문에 의해 생성 된 SQLSTATE
값과 MESSAGE_TEXT
및 MYSQL_ERRNO
항목입니다. 이 값은 다음의 C API에서 얻을 수 있습니다.
SQLSTATE
값 :mysql_sqlstate()
의 호출MYSQL_ERRNO
값 :mysql_errno()
의 호출MESSAGE_TEXT
값 :mysql_error()
의 호출
SQL에서는 SHOW WARNINGS
및 SHOW ERRORS
의 출력 Code
및 Message
컬럼에 MYSQL_ERRNO
및 MESSAGE_TEXT
값이 표시됩니다.
진단 영역에서 정보를 검색하려면 GET DIAGNOSTICS
문을 사용합니다 ( 섹션 13.6.7.3 "GET DIAGNOSTICS 구문" 을 참조하십시오). 진단 영역은 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오.
13.6.7.5.2 핸들러 커서 및 문에 대한 신호의 영향
문의 실행에 대한 신호의 영향은 그 신호의 종류에 따라 다릅니다. 이 클래스는 오류의 심각성이 결정됩니다. MySQL은 sql_mode
시스템 변수의 값을 무시합니다. 특히 엄격한 SQL 모드는 문제가되지 않습니다. MySQL은 IGNORE
도 무시합니다. SIGNAL
의 목적은 사용자가 생성 한 오류를 명시 적으로 발생시킬 수 있기 때문에 신호가 무시 될 수는 없습니다.
다음의 설명에서 "고스트"는 통지 된 SQLSTATE
값에 대한 핸들러가 DECLARE ... HANDLER
에 정의되어 있지 않은 것을 나타냅니다.
클래스 =
'00'
(성공)부정합니다.
'00'
로 시작하는SQLSTATE
값은 성공을 보여주기 위해SIGNAL
에는 유효하지 않습니다.클래스 =
'01'
(경고)warning_count
시스템 변수의 값이 증가합니다.SHOW WARNINGS
가 신호를 나타냅니다.SQLWARNING
핸들러가 신호를 잡는다. 이 신호가 함수 내에서 처리되지 않은 경우, 문이 종료하지 않습니다.클래스 =
'02'
(없음)NOT FOUND
핸들러가 신호를 잡는다. 커서에 영향을주지 않습니다. 이 신호가 함수 내에서 처리되지 않은 경우, 문이 종료합니다.클래스>
'02'
(예외)SQLEXCEPTION
핸들러가 신호를 잡는다. 이 신호가 함수 내에서 처리되지 않은 경우, 문이 종료합니다.클래스 =
'40'
일반 예외로 처리됩니다.
예 :
mysql>delimiter //
mysql>CREATE FUNCTION f () RETURNS INT
->BEGIN
->SIGNAL SQLSTATE '01234'; -- signal a warning
->RETURN 5;
->END//
mysql>delimiter ;
mysql>CREATE TABLE t (s1 INT);
mysql>INSERT INTO t VALUES (f());
결과적으로, 5 번째 행이 테이블 t
에 삽입됩니다. 통지 된 경고는 SHOW WARNINGS
에서 볼 수 있습니다.