Some ideas as I would investigate the failure, in order:
For the STRSQL report, run in debug mode, what is the "data
mapping error"? Is the error a date underflow\overflow, some other
bad data for a date, or a NULL condition error? If the latter, then
probably the null indicator is not being properly set whereas for
one of the other cases the SQL result value is probably in error.
What explicitly is meant by "the null indicator is set to zero"?
Specifically, what is the variable declaration and the data
presented for the display of the variable in debug? "Each indicator
is defined as a two-byte signed integer" so a x'0000' versus x'F0F0'
or x'000F' would be required for a non-null result.
Review the parameter list again, against the PARAMETER STYLE SQL
documentation. Errors in how parameters are passed can often appear
to be functional, when in fact they are functional only by chance
due to layout of [residual] memory in the automatic storage of the
call [stack frames].
What explicitly is meant by "returns a date"? Specifically, what
is the variable declaration and the data presented for the display
of the variable in debug? What are the date format & date separator
defined for the STRSQL session testing the function? What were the
date format & date separator defined for the RUNSQLSTM used to
create the function?
The RUNSQLSTM defaults to DATFMT(*JOB) and DATSEP(*JOB), so if
the function should correctly process the SQL-result as a character
string, is that string being generated in the date format that is
established during run-time [and thus possibly incorrect] or the
date format that was established at definition [i.e. CREATE
FUNCTION] time?
Note that the internal data type DATE is an integer versus any of
the visual string representation(s) available for display; e.g. the
second argument of CHAR(date-arg1,arg2). Does the RPG module form a
character string of digits and separators, perhaps in *ISO date
format? If so, consider that the SQL-result "is passed by address,
the address is of the storage where the return value should be
placed" and the "database provides as much storage as needed for the
return value as defined on the CREATE FUNCTION statement" which
means that for DATE there is room for an integer versus a character
string. I have never created an external scalar user defined
function that RETURNS DATE, but I would expect that I might have to
use the "RETURNS DATE CAST FROM CHAR(10)" such that for example, the
string '2010-01-24' as set in the SQL-result would be known by the
SQL to be a standard\recognizable string representation [in this
example, *ISO] of a date. Previous releases [to 6.1] even show that
CAST as an example for "data-type3 CAST FROM data-type4", and v6r1
shows a DOUBLE\DECIMAL example. If this were the source of a
problem, then that should have been a problem in prior releases.
Regards, Chuck
Lennon_s_j@xxxxxxxxxxx wrote:
I have an RPG UDF that returns a date. It worked on V5R3
and V5R4. We went to V6R1 a a couple of months ago and it
no longer works.
It is registered like this using RUNSQLSTM:
DROP FUNCTION SLENNON/DATE_MDY
;
CREATE FUNCTION SLENNON/DATE_MDY
(INDATE DECIMAL(8,0) )
RETURNS DATE
PARAMETER STYLE SQL
LANGUAGE RPGLE
NO SQL
DETERMINISTIC
EXTERNAL NAME 'SLENNON/DATE_SQL(DATE_MDY)'
CALLED ON NULL INPUT
NO EXTERNAL ACTION
I can watch the RPG code in the debugger and it returns a date
and the null indicator is set to zero, but STRSQL (green screen)
always shows the replacement value (+s). SQuirreL (JBDC) always
shows nulls.
What am I missing? Something seems to have changed in V6R1...
As an Amazon Associate we earn from qualifying purchases.