올바르지 않은 데이터 검색, 올바르지 않은 데이터 삽입 또는 응용프로그램과 데이터 소스 사이 불일치를 예방하기 위해 데이터 소스에 액세스하는 응용프로그램에서 오류를 적절히 처리하는 것은 매우 중요합니다. 이 학습에서는 관계형 데이터베이스에 액세스할 때 오류에 응답하는 데 사용할 수 있는 몇 가지 도구에 대해 설명합니다.
이 학습서의 예제에서는 종종 try 블록에 데이터 액세스 명령문을 둡니다.
function execDropTable(status StatusRec inOut)
try
execute #sql{
DROP TABLE EGL.CUSTOMERTEMP
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
end
end
try 블록에 코드를 넣으면
EGL이 해당 코드를 일반적으로 실행하려 합니다. EGL에 오류가 발생하면
try 블록에서 코드 실행을 중지하고 try 블록에
남아 있는 모든 명령문을 건너뛴 다음 onException
블록으로 직접 이동합니다. onException 블록에
코드를 넣어 오류에서 복구하거나 문제점을 정정하거나 로그 파일에 오류 정보를
쓸 수 있습니다. try 블록에서 EGL에 오류가 발생하면 예외 레코드도 작성하여 오류에 대한 정보를 제공합니다. 해당 레코드를 onException 블록에 전달합니다. 오류의 원인을 판별하고 오류에서 복구하는 데 도움이 되도록 onException 블록에서 해당 레코드의 정보를 사용할 수 있습니다. 위의 예제에서 onException 블록은 오류를 처리하는 함수에 예외 레코드를 전달합니다.
오류 유형에 따라 예외 레코드에는 여러 스테레오타입 중 하나가 있을 수 있습니다. 위의 예제에서 onException 블록은 SQL 오류 및 기타 관계형 데이터베이스 오류용인 SQLException 스테레오타입의 예외 레코드를 요구합니다. EGL에 널값 참조 등과 같은 다른 유형의 오류가 발생하면 다른 유형의 예외 레코드가 작성됩니다(널값 참조의 경우, NullValueException 스테레오타입이 있는 예외 레코드).
function execDropTable(status StatusRec inOut)
try
execute #sql{
DROP TABLE EGL.CUSTOMERTEMP
} ;
onException (exception SQLException)
ConditionHandlingLib.HandleException(status, exception);
onException (exception AnyException)
HandleOtherError(exception);
end
end
이 예제에서 첫 번째 onException 블록은
SQLException 레코드를 요구하며 두 번째 블록은 AnyException 스테레오타입을
요구합니다. 이 경우, EGL에 SQL 오류가 발생하면 첫 번째 onException
블록이 실행됩니다. EGL에 다른 유형의 오류가 발생하면 두 번째 블록이 실행됩니다.
AnyException 스테레오타입은 스테레오타입에 관계없이 모든 오류에 응답하는 데
사용하는 일반 사용자 예외 레코드 스테레오타입입니다. 모든 예외 레코드에는 최소 두 개의 필드(오류의 오류 코드가 있는 messageID 필드 및 문제점의 간략한 설명이 있는 message 필드)가 있습니다. 스테레오타입에 따라 예외 레코드에는 다른 필드가 있을 수 있습니다. 예를 들어, SQLRecord 스테레오타입에는 명령문의 상태가 있는 CHAR(5) 값을 보유하는 sqlState 필드와 DBMS에서의 INT 리턴 코드를 보유하는 sqlCode 필드가 있습니다.
올바르지 않은 정보를 전달하고, 존재하지 않는 레코드를 삭제하거나 갱신 또는 동일한 1차 키가 있는 레코드를 추가하려고 시도하여 예외 처리를 시도할 수 있습니다. 다음 예제에서는 데이터베이스의 기존 행과 같은 ID 번호가 있는 새 고객 레코드를 추가하려 합니다. 따라서, 1차 키와 충돌을 일으키며 EGL이 SQLException 예외를 처리하도록 프롬프트됩니다.
Derby를 포함하여, 대부분의 관계형 데이터베이스는 복구 가능 자원입니다. 복구 가능한 자원을 변경할 때 변경사항을 저장하는 확약을 실행해야 변경사항이 영구적으로 됩니다. 이 방식으로, 변경사항을 확약하기 전에 예외가 발생하는 경우 데이터베이스의 변경사항을 되돌릴 수 있습니다.
예를 들어, 데이터베이스의 여러 사항을 변경한다고 가정하십시오(예: 새 고객 추가 및 해당 고객의 첫 번째 주문에 대한 주문 정보 입력). 일부 해당 오퍼레이션이 다른 오퍼레이션이 실패하기 전에 성공하면 주문이 없는 고객이 남거나 주문을 한 고객이 없는 주문이 남을 수 있습니다. 이런 경우, 다음과 같이 onException 블록에 롤백을 넣어 변경사항을 되돌리고 데이터베이스 외부에 불완전한 정보를 보존하십시오.
Order added successfully. SQL exception EGL0504E message = EGL0504E ADD: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL070307095259210' defined on 'CUSTOMER'.[sqlstate:23505][sqlcode:20000] EGL0002I The error occurred in the exceptionHandlingTest program processing the main function. Performing rollback. The order was rolled back successfully.exceptionHandlingTest.egl 파일의 코드가 완성되었습니다. 파일에 빨간색 X 기호로 표시된 오류가 나타나면 코드가 학습 7에서 완성된 exceptionHandlingTest.egl 파일의 코드와 일치하는지 확인하십시오.
이 학습에서는 SQL 오퍼레이션으로 오류를 처리하는 기초 작업에 대해 배웠습니다. 문제점을 예상하고 응용프로그램이 복구할 수 있도록 예외 처리를 제공하는 것은 매우 중요합니다.