DB2 - Problem description
Problem IC84083 | Status: Closed |
SQLCODE -952 DOES NOT INTERRUPT AN SQL ROUTINE IN PROGRESS | |
product: | |
DB2 FOR LUW / DB2FORLUW / A10 - DB2 | |
Problem description: | |
When an SQL routine executes a statement that completes with SQLCODE -952 (Processing was cancelled due to an interrupt), DB2 incorrectly treats the -952 error as a regular exception condition. If your SQL routine contains an appropriate general condition handler for SQLEXCEPTION, or a specific condition handler for SQLSTATE '57014', the condition handler will activate. It is therefore possible for your SQL routine to continue execution after the interrupt has occurred. Subsequent SQL statements may fail with SQLCODE -20139: SQL20139N SQL statements may not be issued in routine "<routine-name>" (specific name "<specific-name>") because of a previous statement failed or was interrupted. The intended behaviour is that DB2 will interrupt the currently executing SQL routine when SQLCODE -431 or SQLCODE -952 is detected. These errors will be treated as unhandled exception conditions, even if an appropriate condition handler exists. The exception condition for the interrupt will be propagated to the caller. Example: create procedure test language sql begin declare continue handler for sqlexception begin insert into errlog values sqlstate, sqlcode; end; -- Let's say that this called routine fails with SQLCODE -952: call some_other_routine(); insert into T1 values 42; end Here we have a simple SQL procedure that calls another procedure. If the nested procedure call is interrupted with SQLCODE -952, instead of terminating routine TEST, DB2 will incorrectly proceed to dispatch the continue handler for the exception condition. In this case, it will attempt an INSERT from the handler, which will fail with SQLCODE -20139; we will never reach the INSERT into table T1. This is incorrect. What should happen here is that immediately after the call to SOME_OTHER_ROUTINE, procedure TEST should terminate with SQLCODE -952; the condition handler should not be executed. | |
Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * All users of version 10.1 on Linux, Unix and Windows * * platforms. * **************************************************************** * PROBLEM DESCRIPTION: * * See Error Description * **************************************************************** * RECOMMENDATION: * * First fixed in DB2 LUW Version 10.1 Fix Pack 1. * **************************************************************** | |
Local Fix: | |
When coding condition handlers for SQLEXCEPTION, be mindful that this may possibly include SQLCODE -952, until a fix is available. Because condition handlers for specific SQLSTATEs always take precedence over general condition handlers (SQLWARNING, SQLEXCEPTION, NOT FOUND), you can add a specific condition handler for SQLSTATE '57014', which corresponds to SQLCODE -952. Because this interrupt will not be catchable by condition handlers in the future, your handler should do nothing but propagate SQLSTATE '57014' to the caller. We recommend an EXIT handler in the outermost scope of your routine. For example: create procedure test language sql begin declare exit handler for sqlstate '57014' resignal; -- propagate SQLSTATE '57014' to the caller -- Your statements here... end | |
available fix packs: | |
DB2 Version 10.1 Fix Pack 1 for Linux, UNIX, and Windows | |
Solution | |
First fixed in DB2 LUW Version 10.1 Fix Pack 1. | |
Workaround | |
When coding condition handlers for SQLEXCEPTION, be mindful that this may possibly include SQLCODE -952, until a fix is available. Because condition handlers for specific SQLSTATEs always take precedence over general condition handlers (SQLWARNING, SQLEXCEPTION, NOT FOUND), you can add a specific condition handler for SQLSTATE '57014', which corresponds to SQLCODE -952. Because this interrupt will not be catchable by condition handlers in the future, your handler should do nothing but propagate SQLSTATE '57014' to the caller. We recommend an EXIT handler in the outermost scope of your routine. For example: create procedure test language sql begin declare exit handler for sqlstate '57014' resignal; -- propagate SQLSTATE '57014' to the caller -- Your statements here... end | |
Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 11.06.2012 31.10.2012 31.10.2012 |
Problem solved at the following versions (IBM BugInfos) | |
Problem solved according to the fixlist(s) of the following version(s) | |
10.1.0.1 | |
10.5.0.1 |