Si se produce un error cuando el intermediario accede a una base de datos externa, puede dejar que el intermediario genere una excepción durante el proceso del nodo o utilizar sentencias ESQL para procesar la excepción dentro del propio nodo.
Dejar que el intermediario genere una excepción durante el proceso del nodo es el valor predeterminado; se abandona el proceso de ESQL en el nodo actual. A continuación, se propaga la excepción en sentido inverso por el flujo de mensajes hasta que se alcanza un nodo de captación final o el nodo de entrada de este flujo de mensajes. Si la excepción alcanza el nodo de entrada, se restituye una transacción activa.
El uso de sentencias ESQL para procesar la excepción dentro del propio nodo requiere un conocimiento de los códigos de retorno de base de datos y una línea de acción lógica a seguir cuando se produce un error. Para habilitar este proceso de error de base de datos incorporado, debe borrar la propiedad Generar excepción en error de la base de datos del nodo Filter, Database o Compute. Si borra esta propiedad, el nodo establecerá los indicadores de estado de base de datos SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT con la información adecuada del gestor de base de datos, en lugar de generar una excepción.
Los indicadores contienen información solamente cuando se produce un error (no un aviso), a menos que haya seleccionado la propiedad Tratar los avisos como errores. Si una operación de base de datos es satisfactoria, o devuelve un resultado satisfactorio con la información, los indicadores contienen sus valores de resultado satisfactorio predeterminados.
Puede utilizar los valores de estos indicadores contenidos en las sentencias ESQL para decidir la acción que debe llevar a cabo. Puede acceder a estos indicadores con las funciones SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT.
Si intenta procesar errores en línea, compruebe los indicadores de estado después de ejecutar cada sentencia de base de datos para asegurarse de que captura y evalúa todos los errores. Si al procesar los indicadores encuentra un error que no puede manejar en línea, puede generar una excepción nueva para manejarlo en un nodo de captación situado en sentido ascendente o dejar que pase por el nodo de entrada y que, de este modo, se restituya la transacción, para lo cual puede utilizar la sentencia ESQL THROW.
Es posible que desee comprobar el caso especial en el que una sentencia SELECT no devuelve datos. Esta situación no se considera un error y no se establece SQLCODE, por lo tanto, deberá comprobar de forma explícita si se produce; consulte Comprobar las devoluciones de SELECT.
El siguiente ejemplo ESQL muestra cómo utilizar las cuatro funciones de estado de base de datos y cómo incluir la información de error que devuelve una excepción:
DECLARE SQLState1 CHARACTER;
DECLARE SQLErrorText1 CHARACTER;
DECLARE SQLCode1 INTEGER;
DECLARE SQLNativeError1 INTEGER;
-- Convertir una inserción de base de datos en una tabla que no existe --
INSERT INTO Database.DB2ADMIN.NONEXISTENTTABLE (KEY,QMGR,QNAME)
VALUES (45,'REG356','my TESTING 2');
--Recuperar códigos de retorno de base de datos --
SET SQLState1 = SQLSTATE;
SET SQLCode1 = SQLCODE;
SET SQLErrorText1 = SQLERRORTEXT;
SET SQLNativeError1 = SQLNATIVEERROR;
--Utilizar la sentencia THROW para restituir la base de datos y emitir una excepción de usuario--
THROW USER EXCEPTION MESSAGE 2950 VALUES
( 'The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 ,
SQLErrorText1 );
No tiene que generar una excepción cuando detecte un error de base de datos; es posible que prefiera guardar la información de error devuelta en el árbol local e incluir un nodo Filter en el flujo de mensajes que direcciona el mensaje a los subflujos de error o de éxito de acuerdo con los valores guardados.
Puede ver información sobre los ejemplos sólo cuando utilice el Information Center que está integrado en WebSphere Message Broker Toolkit o el Information Center en línea. Puede ejecutar ejemplos sólo cuando utilice el Information Center que está integrado en WebSphere Message Broker Toolkit.