Database

[MySQL] GET DIAGNOSTICS

비번변경 2025. 4. 7. 12:22

개요

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

https://www.datacamp.com/doc/mysql/mysql-get-diagnostics

728x90