• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    2. 데이터 조작 문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    1. BEGIN ... END 복합 명령문 구문
    2. 레이블 구문
    3. DECLARE 구문
    4. 저장 프로그램 내의 변수
    5. 흐름 제어문
    6. 커서
    7. 조건의 처리
    1. DECLARE ... CONDITION 구문
    2. DECLARE ... HANDLER 구문
    3. GET DIAGNOSTICS 구문
    4. RESIGNAL 구문
    5. SIGNAL 구문
    6. 핸들러의 범위에 관한 규칙
    7. MySQL의 진단 영역
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

13.6.7.5 SIGNAL 구문

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)
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 에서 볼 수 있습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved