如果在访问外部数据库时发生错误,您有两个选项:
第一个选项是缺省值;使用该选项将放弃当前节点中的 ESQL 处理。然后异常将通过消息流往回传播,直到到达外层捕获节点或此消息流的输入节点。如果异常到达 input 节点,则回滚任何事务。
第二个选项要求理解数据库返回码和错误发生时所执行操作的逻辑过程。要启用此内联数据库错误处理,则必须清除 Filter、Database 或 Compute 节点的数据库发生错误时抛出异常属性。如果清除此属性,节点将通过数据库管理器使用相应的信息设置四个数据库状态指示符(SQLCODE、SQLSTATE、SQLNATIVEERROR 和 SQLERRORTEXT),而不抛出异常。
除非您选择了将警告作为错误属性,否则这些指示符仅在发生错误(而不是警告)时包含相应的信息。对于“successful”和“success with information”数据库操作,指示符包含它们的缺省成功值。
您可以在 ESQL 语句中使用这些指示符中包含的值来决定要采取的操作。您可以使用 SQLCODE、SQLSTATE、SQLNATIVEERROR 和 SQLERRORTEXT 函数访问这些指示符。
如果尝试内置错误处理,则必须在执行每个数据库语句之后检查状态指示符以确保能够捕获和访问所有错误。处理指示符时,如果遇到无法通过内置方式处理的错误,可以抛出一个新的异常,以便在捕获节点的上游处理它,或者将它发送到输入节点以便回滚事务。您可以使用 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节点,根据保存的值将消息路由到错误或成功的子流。
航班预订样本程序提供使用这些数据库函数的另一个 ESQL 示例。