13.6.7.5 SIGNAL 구문
SIGNALcondition_value[SETsignal_information_item[,signal_information_item] ...]condition_value: SQLSTATE [VALUE]sqlstate_value|condition_namesignal_information_item:condition_information_item_name=simple_value_specificationcondition_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 에서 볼 수 있습니다.