suche 36x36
Latest versionsfixlist
11.1.0.7 FixList
10.5.0.9 FixList
10.1.0.6 FixList
9.8.0.5 FixList
9.7.0.11 FixList
9.5.0.10 FixList
9.1.0.12 FixList
Have problems? - contact us.
Register for free anmeldung-x26
Contact form kontakt-x26

DB2 - Problem description

Problem IT15618 Status: Closed

IF ARRAY USED IN AN OPEN CURSOR IS MODIFIED WRONG RESULT OR A TRAP ARE
POSSIBLE

product:
DB2 FOR LUW / DB2FORLUW / A50 - DB2
Problem description:
When ARRAY is used in an open cursor , but is modififed as we 
are fetching from this cursor, then wrong results or trap are 
possible. 
 
Example #1: 
V_TARGET_TABLE arrayType;-- 
V_TARGET_TABLE[1] := 'value1';-- 
CURSOR cur1 IS SELECT c1 FROM names WHERE c1 LIKE 
(V_TARGET_TABLE(INDEX));-- 
[..] 
OPEN cur1;-- 
V_TARGET_TABLE[1] := 'value2';-- 
FETCH cur1 into temp_vc;-- 
CLOSE cur1;-- 
 
Please, note that above we opened cursor when V_TARGET_TABLE[1] 
had one value, then we changed it to a new value, before we 
started the fetch from the cursor. 
Currently we do not support this and the fix will prevent above 
from running and will return an error (SQL0901N). 
Please, modify your application to make sure that array used in 
the cursor we are fetching from is not changed until we are done 
with the cursor and closed it. 
 
Example #2: 
Another example of unsupported usage that can produce a trap , 
but with the fix , it will return an SQL0901N: 
 
        FOR COUNTER IN 1 .. V_E LOOP 
          FOR CURSORX IN (SELECT COL1 
                      FROM MY_TABLE 
                      WHERE COL2 LIKE  '%[' || V_ARRAY(COUNTER) 
||']%') 
                      LOOP 
            V_ARRAY(V_ARRAY.LAST) := CURSORX.COL1;-- 
          END LOOP;-- 
        END LOOP;-- 
... 
 
Trap Stack will be: 
sqloCrashOnCriticalMemoryValidationFailure 
sqlofmblkEx 
sqlriArrayDescriptor7destroy 
sqlricls_complex 
sqlrr_process_close_request 
sqlrr_close 
csmDriveClose 
csmClose 
pvmPackage11closeCursor 
 
Please, change your application to use local variable in the 
cursor: 
 
        FOR COUNTER IN 1 .. V_E LOOP 
          temp_value = V_ARRAY(COUNTER);-- 
          FOR CURSORX IN (SELECT COL1 
                      FROM MY_TABLE 
                      WHERE COL2 LIKE  '%[' || temp_value 
||']%') 
                      LOOP 
            V_ARRAY(V_ARRAY.LAST) := CURSORX.COL1;-- 
          END LOOP;-- 
        END LOOP;-- 
 
This change will prevent both a trap and an SQL0901N.
Problem Summary:
**************************************************************** 
* USERS AFFECTED:                                              * 
* ALL                                                          * 
**************************************************************** 
* PROBLEM DESCRIPTION:                                         * 
* See Error Description                                        * 
**************************************************************** 
* RECOMMENDATION:                                              * 
* Upgrade to Db2 10.5 Fix Pack 9 or higher                     * 
****************************************************************
Local Fix:
Change the logic to avoid reusing updated array in the cursor as 
we are fetching. Please, see Description for examples.
Solution
First fixed in Db2 10.5 Fix Pack 9
Workaround
not known / see Local fix
Timestamps
Date  - problem reported    :
Date  - problem closed      :
Date  - last modified       :
07.06.2016
29.09.2017
12.10.2017
Problem solved at the following versions (IBM BugInfos)
9.0.
Problem solved according to the fixlist(s) of the following version(s)