DB2 - Problem description
| Problem IC73317 | Status: Closed |
ASSIGNMENT OF PREDICATE TO BOOLEAN VARIABLE INSIDE OF AN IF-STATEMENT CAUSES SYNTAX ERROR. | |
| product: | |
DB2 FOR LUW / DB2FORLUW / 970 - DB2 | |
| Problem description: | |
The assignment of a predicate to a boolean variable may result
in a syntax error, SQL0104N, when all of the following
conditions
are met:
- An SQL procedure, compiled SQL function, or compiled trigger
contains an IF statement;
- Each THEN, ELSE IF, or ELSE clause in the IF statement
contains an assignment to the same Boolean variable, and no
other
statements;
- The right-hand side of at least one of the assignment
statements is a predicate.
Example (PL/SQL, DB2_COMPATIBILITY_VECTOR=ORA):
declare
b boolean;
m varchar2(1);
begin
IF m = 'A' THEN
b := m = 'A';
ELSE
b := false;
end if;
end@
which results in an error similar to the following:
SQL0104N An unexpected token "=" was found following "N
:HV00009 :HI00009".
Expected tokens may include: "CONCAT". LINE NUMBER=1.
SQLSTATE=42601
The equivalent DB2 SQL PL example is:
begin
declare b boolean;
declare m varchar(1);
if m = 'A' then
set b = m = 'A';
end if;
end@ | |
| Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * ALL * **************************************************************** * PROBLEM DESCRIPTION: * * The assignment of a predicate to a boolean variable may * * result * * in a syntax error, SQL0104N, when all of the following * * * * conditions * * * * are met: * * * * * * * * - An SQL procedure, compiled SQL function, or compiled * * trigger * * contains an IF statement; * * * * - Each THEN, ELSE IF, or ELSE clause in the IF statement * * * * contains an assignment to the same Boolean variable, and no * * * * other * * * * statements; * * * * - The right-hand side of at least one of the assignment * * * * statements is a predicate. * * * * * * * * Example (PL/SQL, DB2_COMPATIBILITY_VECTOR=ORA): * * * * * * * * declare * * * * b boolean; * * * * m varchar2(1); * * * * begin * * * * IF m = 'A' THEN * * * * b := m = 'A'; * * * * ELSE * * * * b := false; * * * * end if; * * * * end@ * * * * * * * * which results in an error similar to the following: * * * * * * * * SQL0104N An unexpected token "=" was found following "N * * * * :HV00009 :HI00009". * * * * * * * * Expected tokens may include: "CONCAT". LINE NUMBER=1. * * * * SQLSTATE=42601 * * * * * * * * The equivalent DB2 SQL PL example is: * * * * * * * * begin * * * * declare b boolean; * * * * declare m varchar(1); * * * * * * * * if m = 'A' then * * * * set b = m = 'A'; * * * * end if; * * * * end@ * **************************************************************** * RECOMMENDATION: * * Upgrade to DB2 Version 9.7 Fix Pack 5. * **************************************************************** | |
| Local Fix: | |
As a workaround, if you have an assignment with a boolean-valued
expression inside an IF statement, insert a NULL statement
(PL/SQL) or an empty compound statement (SQL PL) immediately
before or after the assignment. For the PL/SQL case given in
the
error description:
declare
b boolean;
m varchar2(1);
begin
IF m = 'A' THEN
null; -- workaround
b := m = 'A';
end if;
end@
In DB2 SQL PL, the equivalent workaround is:
begin
declare b boolean;
declare m varchar(1);
if m = 'A' then
begin end; -- workaround
set b = m = 'A';
end if;
end@ | |
| available fix packs: | |
DB2 Version 9.7 Fix Pack 5 for Linux, UNIX, and Windows | |
| Solution | |
This problem will be fixed in DB2 Version 9.7 Fix Pack 5. | |
| Workaround | |
not known / see Local fix | |
| Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 16.12.2010 07.12.2011 07.12.2011 |
| Problem solved at the following versions (IBM BugInfos) | |
9.7.FP5 | |
| Problem solved according to the fixlist(s) of the following version(s) | |
| 9.7.0.5 |
|