본문 바로가기
DATABASE/MsSQL

[MsSQL] Exception / Try~Catch 문 활용 -Transaction, Throw

by DANEW 2023. 7. 30.

Intro

안녕하세요

초보 DBA 다뉴입니다.

저번포스팅 Exception / Try ~ Catch문 기초에 이어서 활용하는 방법에 대해서 한번 알아보려고 하는데요.

 

기초에 대해 정리한 글이 궁금하신분은 아래의 글을 참조바랍니다!

https://da-new.tistory.com/57


Transaction 제어

Begin Tran을 사용한 Commit / Rollback

begin try
	begin tran
		/*실행할 Transaction*/
	-- 오류가 없다면 commit
	commit tran
end try
begin catch
	-- 오류 발생시 rollback
	rollback tran
end catch
  • Try 블록에 오류가 없을 경우 commit tran 까지 동작 후 catch를 건너뛴다.
  • Try 블록에 오류가 있을 경우 catch블록으로 이동 하여 rollback tran이 실행된다.

예제

create table #TB_Tran_Test(
  seq int, -- 실행 순서
  txt varchar(100) -- 실행 내용
)

begin try
  begin tran
    insert #TB_Tran_Test values(1, '정상 실행')
  commit tran  
  
  begin tran
    insert #TB_Tran_Test values(1, 2/0) -- 에러
  commit tran
end try
begin catch
  rollback tran
end catch

select * from #TB_Tran_Test

  • 여러 Commit을 통해 일정부분까지 반영 하도록 할 수 있다.
  • 에러가 나기전 Commit까지 Commit이 완료되며, 에러 난 후로는 롤백이 된다.

Throw - 예외 발생시키기

Throw란?

  • Throw는 쿼리문에서 사용자가 직접 예외를 발생시킬 수 있게 해줍니다.
throw error_number, message, state;
  • error_number
    • 예외를 나타는 상수 or 변수이다.
    • int형 이며 50000 이상 2147483647이하의 수여야 한다.
  • message
    • 예외를 설명하는 문자열 or 변수이다.
    • nvarchar형 이며 길이는 2048이다.
  • state
    • 메시지와 연결할 상태를 나타내는 상수 or 변수이다.
    • tinyint형 이며 0~255사이 이다.
  • Throw문 앞의 문은 세미콜론(;)으로 끝나야한다.
  • Try~Catch 문을 사용할 수 없으면 명령문 일괄 처리가 종료되며, 예외가 발생한 줄 번호와 프로시저가 설정됩니다.
  • 심각도는 16으로 설정됩니다.
  • 매개 변수 없이 지정된 Throw문은 Catch블록 안에 있어야 한다. 이 경우 예외가 발생한다.
  • message의 텍스트에 %는 예약문자로 사용하기위해서는 %%로 사용해야한다.

예외 발생 예제

Throw 사용 - 기본

THROW 50001, 'Test Error', 1;

Try 구문에서 Thow사용

DECLARE @height int
set @height = 250

begin try
  if @height >= 230
    begin;
      throw 50001, '키에 230 이상을 입력 할 수 없습니다', 1
    end
end try
begin catch
  print @height
  print ERROR_NUMBER()
  print ERROR_SEVERITY()
  print ERROR_STATE()
  print ERROR_MESSAGE()
end catch

  • Try문에서 발생한 예외는 심각도 16으로 Catch문으로 이동한다.

Catch 구문에서 Throw사용

set @height = 250

begin try
  if @height >= 230
    begin;
      throw 50001, '키에 230 이상을 입력 할 수 없습니다', 1;
    end
end try
begin catch
  print @height;
  
  throw;

  print ERROR_NUMBER()
  print ERROR_SEVERITY()
  print ERROR_STATE()
  print ERROR_MESSAGE()
end catch

  • Catch문에서 매개변수 없는 throw는 try문의 오류를 출력한다.

Outro

Exception 을 활용한 Transaction 제어와 Throw를 활용한 오류 메시지 활용에 대해 알아봤는데요.

 

이 외에도 심각도, RAISERROR, FORMATMESSAGE 등의 소소하게나마 더 알아두면 좋은 항목들이 있습니다.

이 부분에 대해서는 기회가있다면 추후 자세히 다루도록 하겠습니다.

 

감사합니다.

 

반응형