프로시저의 예외처리 및 새로운 기능 MSSQL2005 :
http://cafe.naver.com/ebasenet.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=169
예외처리 사용 방법 :
분기문의 마지막 시간이다.
TRY..CATCH MSSQL 2000에서 주로 사용되던 @@ERROR함수를 2005부턴 거의 사용할 필요가 없게 해주는
예외처리 분기문이다.(하지만 알고는 있어야 한다...;;;)
.NET이나 java등에서도 동일하게 사용되니... 역시나 VB6(VBA)에서 goto문만 알고 있는 개발자면
어찌되었건 불리하다.
구문은 심플하다.
BEGIN TRY
실행구문~~
END TRY
BEGIN CATCH
예외처리~~
END CATCH
대표적인C#에서표현해보자믄....
Try
{
실행구문~~
}
catch(Exception e)
{
실행구문~~
}
역시 VB6(VBA) 하나만 가지구는 스킬 향상에 불리한점이 많다는것을 느낄것이다.
그럼 간단하게 예제를 만들어보자....
CREATE PROC p_test1(@i INT)
AS
BEGIN
DECLARE @eMessage NVARCHAR(MAX)
, @eSeverity INT
, @eState INT
BEGIN TRY
PRINT 1 / @i
END TRY
BEGIN CATCH
PRINT '오류번호는' + CONVERT(VARCHAR(3), ERROR_NUMBER())
PRINT '오류심각도는' + CONVERT(VARCHAR(3), ERROR_SEVERITY())
PRINT '오류상태번호는' + CONVERT(VARCHAR(3), ERROR_STATE())
PRINT '오류발생프로시저명은' + ERROR_PROCEDURE()
PRINT '오류가발생한구문의라인은' + CONVERT(VARCHAR(3), ERROR_LINE())
PRINT ERROR_MESSAGE()
SET @eMessage = ERROR_MESSAGE()
SET @eSeverity = ERROR_SEVERITY()
SET @eState = ERROR_STATE()
RAISERROR(@eMessage, @eSeverity, @eState) -- 에러정보를등록합니다.
END CATCH
END
EXEC p_test1 0
결과는 ..............
오류 번호는 *
오류 심각도는 16
오류 상태 번호는 1
오류 발생 프로시저명은 p_test1
오류가 발생한 구문의 라인은 9
0으로 나누기 오류가 발생했습니다.
메시지 50000, 수준 16, 상태 1, 프로시저 p_test1, 줄 24
0으로 나누기 오류가 발생했습니다.
이넘을 SQL2005이전 버전으로 구현한다면
CREATE PROC p_test2(@i INT)
AS
BEGIN
DECLARE @eMessage NVARCHAR(MAX)
, @eSeverity INT
, @eState INT
IF(@i = 0)
BEGIN
SET @eMessage = '0으로 나누기 오류가 발생했습니다.'
SET @eSeverity = 16
SET @eState = 1
PRINT '오류번호는 *'
PRINT '오류심각도는 16'
PRINT '오류상태 번호는 1'
PRINT '오류발생 프로시저명은 p_test1'
PRINT '오류가 발생한 구문의 라인은?'
PRINT @eMessage
RAISERROR(@eMessage, @eSeverity, @eState) -- 에러 정보를 등록합니다.
END
ELSE
PRINT 1 / @i
END
혹은
ALTER PROC p_test2(@i INT)
AS
BEGIN
DECLARE @eMessage NVARCHAR(MAX)
, @eSeverity INT
, @eState INT
PRINT 1 / @i
IF(@@ERROR != 0)
BEGIN
SET @eMessage = '0으로 나누기 오류가 발생했습니다.'
SET @eSeverity = 16
SET @eState = 1
PRINT '오류 번호는*'
PRINT '오류 심각도는 16'
PRINT '오류 상태번호는 1'
PRINT '오류 발생 프로시저명은 p_test1'
PRINT '오류가 발생한 구문의 라인은 ?'
PRINT @eMessage
END
END
EXEC p_test2 0
느껴지능가?
2005버전부터는 오류에 대한 내용을 서버에게 걍 맞겨만 두므로
개발자가 직접 예외에 대한 설정을 일일이 할 필요가 없다.
글치만 이전의 버전에선 예상되는 오류에 대한 설정을 일일이 해주어야 한다.
C#이나 java등을 개발하던 사람이라면 친근하면서도
약간은 의존적인 TRY..CATCH문에 대해서 매우 만족할것으로 보인다.
이것만으로도 때론 엄청난양의 삽질을 줄여줄수도 있기 때문이다.
다만 TRY..CATCH문이라 할지라도 심각도 수준 20이상(하드웨어 이상등등)의 오류를 검출할 수는 없다.
TRANSACTION에서의 SET XACT_ABORT ON(런타임중 오류발생시 트랜잭션을 중단) 설정과 함께 TRY..CATCH문을 다루는 것은 TRANSACTION강좌에서 다루어 보도록 하고
간단하게 이넘들과 함께 무더가는 함수들을 MSDN을 보믄서 나열해보겠다.
1. ERROR_MESSAGE()
: TRY...CATCH 구문의 CATCH 블록을 실행시키는 오류의 메시지 텍스트를 반환합니다.
2. ERROR_LINE()
: TRY...CATCH 구문의 CATCH 블록 실행을 유발한 오류가 발생한 줄 번호를 반환합니다.
3. ERROR_NUMBER()
: TRY...CATCH 구문의 CATCH 블록을 실행시킨 오류의 오류 번호를 반환합니다.
4. ERROR_STATE()
: TRY...CATCH 구문의 CATCH 블록을 실행시킨 오류의 상태 번호를 반환합니다.
5. ERROR_PROCEDURE()
: TRY...CATCH 구문의 CATCH 블록이 실행되는 오류가 발생한 저장 프로시저나 트리거의 이름을 반환합니다.
6. ERROR_SEVERITY()
: TRY...CATCH 구문의 CATCH 블록이 실행되도록 한 오류의 심각도를 반환합니다.
자 그럼 옵션으로 오라클에서의 예외처리 방법이다.
결론적으로 오라클에선 EXCEPTION문으로 이를 처리하게되는데
예제를 보믄 바로 이해가 되리라 본다.
BEGIN
실행구문~~
EXCEPTION
예외처리구분~~
END;
ex)
BEGIN
SELECT 1 / 0
EXCEPTION
SELECT '0으로 나누기 오류가 발생했습니다.'
END;
역시나 아주 심플하다..
심도있는 오라클 강좌는 기회가 된다면 내가 쓰거나(그럴리가 거의 엄을듯.. DB는 넘 실타..;;)
이 분야의 전문가 분이 계시면 요청시 강좌란을 개설하도록 하겠다.
새벽 3시가 넘었다....
자야겠다...T_T
-------------------------------------------------------------------------------------------------------------------
프로시저의 기본적인 내용 : http://wishkjh.blog.me/80013950564
파워빌더에서 프로시저 호출시 OUTPUT 관련 :
http://blog.naver.com/ok_yoonbari?Redirect=Log&logNo=150080934966