외부 데이터베이스에 액세스할 때 오류가 발생하는 경우 두 가지 옵션을 사용할 수 있습니다.
첫 번째 옵션이 디폴트이며 현재 노드에서의 ESQL 처리를 포기합니다. 그러면 포함된 포착 노드나 플로우의 입력 노드에 이를 때까지 메시지 플로우를 따라 역으로 전달됩니다. 예외가 입력 노드에 이르면 트랜잭션이 롤백됩니다.
두 번째 옵션에서는 데이터베이스 리턴 코드와 오류 발생 시 취할 논리적 조치 과정에 대한 이해가 필요합니다. 이 인라인 데이터베이스 오류 처리를 사용하려면 Filter, Database 또는 Compute 노드의 데이터베이스 오류에서 예외 전달 등록 정보를 선택 취소해야 합니다. 이렇게 수행하는 경우, 예외가 발생하는 대신 노드가 데이터베이스 상태 표시자 SQLCODE, SQLSTATE, SQLNATIVEERROR 및 SQLERRORTEXT를 데이터베이스 관리자의 적절한 정보로 설정합니다.
경고를 오류로 처리 등록 정보를 선택하지 않았으면 표시자에는 오류(경고가 아님) 발생 시에만 해당하는 정보가 들어 있습니다. 성공 및 정보와 함께 성공 데이터베이스 조작의 경우 표시자에는 디폴트인 성공 값이 들어 있습니다.
이들 표시기에 들어 있는 값을 ESQL문에서 사용하면 취할 조치에 대한 결정을 내릴 수 있습니다. 이러한 표시기에는 SQLCODE , SQLSTATE, SQLNATIVEERROR 및 SQLERRORTEXT 함수를 사용하여 액세스합니다.
인라인 오류 처리를 시도하고 있는 경우 오류 누락을 방지하기 위해 각 데이터베이스 명령문이 실행된 후에 상태 표시기를 점검해야 합니다. 표시기를 처리할 때 인라인으로 처리할 수 없는 오류를 경험한 경우 Catch 노드에서 업스트림으로 처리하거나 트랜잭션을 롤백하기 위해 입력 노드로 이동하도록 새로운 예외를 제기하려 할 수도 있습니다. 이를 수행하기 위해 ESQL THROW문을 사용할 수 있습니다.
SELECT가 데이터를 리턴하지 않는 특별한 경우를 점검하려고 할 수 있습니다. 이러한 상황은 오류로 간주되지 않고 SQLCODE가 설정되지 않으므로, 명확하게 테스트해야 합니다. 이에 대해서는 SELECT로 리턴 점검에 설명되어 있습니다.
다음 ESQL 예에서는 이 네 개의 데이터베이스 상태 함수를 사용하는 방법과 예외에서 리턴된 오류 정보를 포함할 수 있는 방법을 보여줍니다.
DECLARE SQLState1 CHARACTER; DECLARE SQLErrorText1 CHARACTER; DECLARE SQLCode1 INTEGER; DECLARE SQLNativeError1 INTEGER; -- Make a database insert to a table that does not exist -- INSERT INTO Database.DB2ADMIN.NONEXISTENTTABLE (KEY,QMGR,QNAME) VALUES (45,'REG356','my TESTING 2'); --Retrieve the database return codes -- SET SQLState1 = SQLSTATE; SET SQLCode1 = SQLCODE; SET SQLErrorText1 = SQLERRORTEXT; SET SQLNativeError1 = SQLNATIVEERROR; --Use the THROW statement to back out the database and issue a user exception-- THROW USER EXCEPTION MESSAGE 2950 VALUES ( 'The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 , SQLErrorText1 );
데이터베이스 오류 감지 시 예외를 전달할 필요가 없습니다. LocalEnvironment 트리에서 리턴된 오류 정보를 저장하고, 저장된 값에 따라 메시지를 오류 또는 성공 서브플로우로 라우트하는 Filter 노드를 사용자 메시지 플로우에 포함하려고 할 수 있습니다.
Airline Reservations 샘플 프로그램은 이 데이터베이스 기능을 사용하는 ESQL의 다른 예를 제공합니다.