개요
2025.03.24-[MySQL] Stored Procedure - HANDLER에서 SQL을 사용하며 발생하는 에러를 처리하기 위한 핸들러를 알아보았었다. 이번 글에서는 비슷하게 에러를 다루는 데 사용할 수 있는 GET DIAGNOSTICS라는 구문을 알아보려고 한다.
DIAGNOSTICS
SQL문을 실행 시 진단 영역에 진단 정보를 생성하는데, 진단 정보는 SQL 실행 중 발생한 오류에 대한 정보를 포함한다. 진단 정보를 통해서 오류 코드, 경고, 영향을 받은 행 수 및 조건, 명령문에 대한 기타 진단 데이터와 같은 세부 정보에 접근할 수 있다.
진단 영역은 크게 발생한 조건 수나 영향을 받은 행 수와 같은 명령문 정보와 오류 코드 및 메시지 등의 조건 정보로 구성되어 있다. 명령문이 여러 조건(condition)을 발생시킨 경우에는 각 조건의 조건 영역을 포함한다. 아래 예시는 세 가지고 조건을 생성하는 명령문을 실행할 때 진단 영역에 포함되는 정보를 나타낸 것이다.
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 구문은 진단 정보를 조회할 수 있는 구문이다.
아래 명령은 조건의 수(NUMBER)와 영향을 미친 수를 사용자 변수(ROW_COUNT)에 저장한다.
GET DIAGNOSTICS @p1 = NUMBER, @p2 = ROW_COUNT;
아래 명령은 특정 조건의 정보를 사용자 변수에 저장한다. 예시는 SQLSTATE의 값과 에러 메시지를 사용자 정보에 저장하는 것이다.
GET DIAGNOSTICS CONDITION 1
@p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT;
보통 명령문에 대한 에러를 처리하게 되면 맨처음 조건인 1번 영역에 저장된 정보를 주로 확인하는 것 같다.
예시
예로 들어 아래와 같이 데이터베이스 내에 존재하지 않는 테이블에 대한 SELECT 문을 수행해 보고, 그 진단 정보를 확인해 본다.
SELECT * FROM test.no_such_table;
먼저 실행한 명령문이 발생시킨 조건은 몇 개인지, 영향을 미친 행의 수는 몇 개인지 확인해 보았을 때, 조건은 1개이고 영향을 받은 행의 수는 없는 것으로 보인다.
다음으로 1번 조건의 정보를 확인해 보았다.
출력으로 확인할 수 있는 SQL 에러의 정보가 @p3, @p4 변수를 통해 조회할 수 있는 모습을 확인할 수 있다.
참고 문서
https://dev.mysql.com/doc/refman/8.4/en/get-diagnostics.html
https://www.mysqlkorea.com/?depth=13060707
https://www.tutorialspoint.com/mysql/mysql_get_diagnostic_statement.htm