13.6.7.3 GET DIAGNOSTICS 구문
GET [CURRENT] DIAGNOSTICS {statement_information_item
[,statement_information_item
] ... | CONDITIONcondition_number
condition_information_item
[,condition_information_item
] ... }statement_information_item
:target
=statement_information_item_name
condition_information_item
:target
=condition_information_item_name
statement_information_item_name
: NUMBER | ROW_COUNTcondition_information_item_name
: CLASS_ORIGIN | SUBCLASS_ORIGIN | RETURNED_SQLSTATE | MESSAGE_TEXT | MYSQL_ERRNO | CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CATALOG_NAME | SCHEMA_NAME | TABLE_NAME | COLUMN_NAME | CURSOR_NAMEcondition_number
,target
: (see following discussion)
SQL 문은 진단 영역을 채우는 진단 정보를 생성합니다. GET DIAGNOSTICS
문을 사용하면 응용 프로그램에서이 정보를 확인할 수 있습니다. 이것은 MySQL 5.6.4의 시점에서 사용할 수 있습니다. ( SHOW WARNINGS
또는 SHOW ERRORS
를 사용하여 조건 또는 오류를 확인할 수 있습니다.)
GET DIAGNOSTICS
실행하는 데 특별한 권한이 필요하지 않습니다.
키워드 CURRENT
는 현재의 진단 영역에서 정보를 검색하는 것을 보여줍니다. MySQL은 그것이 기본 동작이기 때문에 이것은 아무 효과도 없습니다.
GET DIAGNOSTICS
은 일반적으로 저장 프로그램에서 핸들러에서 사용되지만, 이것은 어떤 SQL 문 실행을 확인하기 위해 핸들러의 컨텍스트 외부에서 허용되는 MySQL 확장입니다. 예를 들어, mysql 클라이언트 프로그램을 호출하는 경우 프롬프트에서 다음 명령을 입력 할 수 있습니다.
mysql>DROP TABLE test.no_such_table;
ERROR 1051 (42S02): Unknown table 'test.no_such_table' mysql>GET DIAGNOSTICS CONDITION 1
->@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
mysql>SELECT @p1, @p2;
+-------+------------------------------------+ | @p1 | @p2 | +-------+------------------------------------+ | 42S02 | Unknown table 'test.no_such_table' | +-------+------------------------------------+
진단 영역은 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오. 쉽게 말하면, 여기에는 다음의 2 종류의 정보가 포함되어 있습니다.
발생 조건의 수와 영향을받은 행수 등의 문 정보.
오류 코드 및 메시지 등의 조건 정보. 문이 여러 조건을 발생시킨 경우 진단 영역이 부분에는 각 조건의 조건 영역이 포함되어 있습니다. 문이 어떤 조건도 발생시키지 않는 경우 진단 영역이 부분은 비어 있습니다.
3 개의 조건을 생성하는 명령문의 경우 진단 영역에는 다음과 같은 명령문 정보와 조건 정보가 포함되어 있습니다.
Statement information : row count ... other statement information items ... Condition area list : Condition area 1 : error code for condition 1 error message for condition 1 ... other condition information items ... Condition area 2 : error code for condition 2 : error message for condition 2 ... other condition information items ... Condition area 3 : error code for condition 3 error message for condition 3 ... other condition information items ...
GET DIAGNOSTICS
은 문 또는 조건 정보 중 하나를 얻을 수 있지만 같은 문 모두를 얻을 수 없습니다.
문 정보를 얻으려면 원하는 문 항목을 대상 변수로 가져옵니다.
GET DIAGNOSTICS
다음의 예에서는 사용 가능한 조건의 수와 영향을받은 행 수를 사용자 변수@p1
과@p2
에 할당합니다.GET DIAGNOSTICS @ p1 = NUMBER @ p2 = ROW_COUNT;
조건 정보를 얻으려면 조건 번호를 지정하고 원하는 조건 항목을 대상 변수로 가져옵니다.
GET DIAGNOSTICS
다음 예에서는 SQLSTATE 값과 오류 메시지를 사용자 변수@p3
와@p4
에 할당합니다.GET DIAGNOSTICS CONDITION 1 @ p3 = RETURNED_SQLSTATE @ p4 = MESSAGE_TEXT;
검색 목록에는 쉼표로 구분 된 하나 이상의
할당을 지정합니다. 각 할당은 대상 변수와이 문이 문 또는 조건 정보 중 어떤 것을 얻을 여부에 따라 target
= item_name
statement_information_item_name
또는 condition_information_item_name
지시자 중 하나를 지정합니다.
항목 정보를 저장하기위한 유효한 target
지시자는 저장 프로 시저 또는 저장 함수의 매개 변수 DECLARE
에서 선언 된 프로 프로그램의 로컬 변수 사용자 정의 변수 중 하나입니다.
유효한 condition_number
지시자는 저장 프로 시저 또는 저장 함수의 매개 변수 DECLARE
에서 선언 된 프로 프로그램의 로컬 변수 사용자 정의 변수, 시스템 변수, 리터럴 중 하나입니다. 문자 리터럴은 _charset
인트로 듀서를 포함 할 수 있습니다. 조건 1부터 정보가 포함되어있는 조건 영역의 수까지의 범위에없는 경우 경고가 발생합니다. 이 경우이 경고는 진단 영역에 그 영역을 클리어하지 않고 추가됩니다.
현재는 조건이 발생했을 때 MySQL이 GET DIAGNOSTICS
의해 인식되는 모든 조건 항목을 채우는 것은 아닙니다. 예 :
mysql>GET DIAGNOSTICS CONDITION 1
->@p5 = SCHEMA_NAME, @p6 = TABLE_NAME;
mysql>SELECT @p5, @p6;
+------+------+ | @p5 | @p6 | +------+------+ | | | +------+------+
표준 SQL에서는 여러 조건이있는 경우 첫 번째 조건은 이전의 SQL 문에 대해 반환 된 SQLSTATE
값에 관련하고 있습니다. MySQL에서는 이것이 보장되지 않습니다. 메인 오류를 얻기 위해 다음과 같이 할 수 없습니다.
GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO;
대신 먼저 조건 수를 검색 한 다음 그것을 사용하여 어떤 조건 번호를 검사할지 여부를 지정합니다.
GET DIAGNOSTICS @cno = NUMBER; GET DIAGNOSTICS CONDITION @cno @errno = MYSQL_ERRNO;
허용되는 문 정보와 조건 정보의 항목 및 조건이 발생했을 때 어떤 항목이 이입되는지에 대해서는 섹션 13.6.7.7.2 "진단 영역의 정보 항목" 을 참조하십시오.
저장 프로 시저의 컨텍스트에서 GET DIAGNOSTICS
와 예외 처리기를 사용하여 삽입 작업의 결과를 평가하는 방법을 보여줍니다. 삽입이 성공했을 경우,이 프로는 GET DIAGNOSTICS
를 사용하여 영향을받은 행 수를 가져옵니다. 이것은 진단 영역이 클리어되지 않는 한, GET DIAGNOSTICS
를 여러 번 사용하여 명령문에 대한 정보를 얻을 수 있음을 보여줍니다.
CREATE PROCEDURE do_insert (value INT) BEGIN - Declare variables to hold diagnostics area information DECLARE code CHAR (5) DEFAULT '00000'; DECLARE msg TEXT; DECLARE rows INT; DECLARE result TEXT; - Declare exception handler for failed insert DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT; END; - Perform the insert INSERT INTO t1 (int_col) VALUES (value); - Check whether the insert was successful IF code = '00000'THEN GET DIAGNOSTICS rows = ROW_COUNT; SET result = CONCAT ( 'insert succeeded, row count ='rows); ELSE SET result = CONCAT ( 'insert failed, error ='code ', message ='msg); END IF; - Say what happened SELECT result; END;
t1.int_col
이 NOT NULL
로 선언 된 정수 컬럼이라고합니다. 이 프로시 저는 NULL
이 아닌 값과 NULL
값을 삽입하기 위해 호출하면 각각 다음의 결과를 생성합니다.
mysql>CALL do_insert(1);
+---------------------------------+ | result | +---------------------------------+ | insert succeeded, row count = 1 | +---------------------------------+ mysql>CALL do_insert(NULL);
+-------------------------------------------------------------------------+ | result | +-------------------------------------------------------------------------+ | insert failed, error = 23000, message = Column 'int_col' cannot be null | +-------------------------------------------------------------------------+
GET DIAGNOSTICS
조건 핸들러에서 진단 영역을 클리어하고, 그 핸들러를 활성화 한 조건에 관한 정보가 손실 될 수있는 다른 문 앞에 사용하도록하십시오. 진단 영역이 언제 설정 및 클리어되는지에 대해서는 섹션 13.6.7.7 "MySQL의 진단 영역" 을 참조하십시오.