외부 데이터베이스에 액세스할 때 오류가 발생하는 경우 두 가지 옵션을 사용할 수 있습니다.
첫 번째 옵션이 디폴트이며 현재 노드에서의 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 샘플 프로그램은 이 데이터베이스 기능을 사용하는 ESQL의 다른 예를 제공합니다.