본문 바로가기
프로그래밍/DBMS

MSSQL TRY CATCH 와 커서 (ERROR 16915)

by zoo10 2014. 12. 9.

MSSQL에서 오라클로 데이터를 밀어넣는 작업중이었다.

MSSQL 프로시져에서 트랜잭션을 유지하려고 TRY... CATCH문을 이용했는데...

계속 '커서가 이미 있다'는 에러가 떨어지는 것이었다.

커서 사용 문법을 한 백번 정도 쳐다봤는데 이상 없었다. 아무리봐도 맞게 썼다. 그러다 찾았다.

이 문제는 이게 어플리케이션(C#) 프로그램이었으면 금방 찾았을 것이다. 어플리케이션에서 try catch시 catch문에 들어가면 오브젝트들 자원해제를 해준다. finally에서 하기도 하고..

그것 때문이었다. 열려진 커서가 예외상황이 발생하면서 오픈되채로 catch문으로 들어가 버려서 나는 에러였다.

아~~

그래서 TRY CATCH문에 아래와 같이 처리했다.


BEGIN TRY
    DECLARE CURSOR CUR FOR
    .......
    OPEN CUR
    FETCH NEXT ....
    WHILE ....
        BEGIN
            .......
            FETCH NEXT....
        END

        CLOSE CUR
        DEALLOCATE CUR

END TRY

BEGIN CATCH
    IF EXISTS (SELECT 1 FROM SYS.SYSCURSORS WHERE CURSOR_NAME = 'CUR')
    BEGIN
        CLOSE CUR
        DEALLOCATE CUR
    END

END CATCH


위 구문을 추가하니 해결됬다.

이것과 관련 없는 다른 에러가 난건 안 자랑.. ㅠㅠ