Please try to specify "BEGIN NOT ATOMIC".
There is the following statement in "Description" of "Compound SQL
(compiled)" in "DB2 SQL Reference Volume 2".
Quote:
If the ATOMIC keyword is specified in a dynamically prepared compound
statement or an SQL function that is not within a module, the compound
|
statement is processed as a compound SQL (inlined) statement. <<
You can't use CASE statement in a compound SQL (inlined).
Moreover, it is not neccesary to use CASE statement in your GET_DATA
UDF.
Example 1:
(by using CASE expression)
CREATE FUNCTION GET_DATA(V_ACTION CHAR(1), V_ACT_DATE DATE)
RETURNS TABLE ( ID INTEGER
, FIELD_1 INTEGER
, FIELD_2 INTEGER
)
LANGUAGE SQL
NO EXTERNAL ACTION
DETERMINISTIC
RETURN
SELECT ID, FIELD_1, FIELD_2
FROM TABLE_1
WHERE ACT_DATE
= CASE
WHEN V_ACTION = 'C' THEN
(SELECT ACT_DATE
FROM DATE_TABLE
WHERE D2_DATE = V_ACT_DATE
)
WHEN V_ACTION = 'A' THEN
V_ACT_DATE
END
!
Example 2:
RETURN
SELECT ID, FIELD_1, FIELD_2
FROM TABLE_1
WHERE V_ACTION = 'C'
AND ACT_DATE
= (SELECT ACT_DATE
FROM DATE_TABLE
WHERE D2_DATE = V_ACT_DATE
)
OR V_ACTION = 'A'
AND ACT_DATE = V_ACT_DATE
Example 3:
RETURN
SELECT t1.ID, t1.FIELD_1, t1.FIELD_2
FROM TABLE_1 AS t1
LEFT OUTER JOIN
DATE_TABLE AS dt
ON V_ACTION = 'C'
AND t1.ACT_DATE = dt.ACT_DATE
AND dt.D2_DATE = V_ACT_DATE
WHERE dt.ACT_DATE IS NOT NULL
OR V_ACTION = 'A'
AND t1.ACT_DATE = V_ACT_DATE