On 19-Oct-2015 12:19 -0500, Mario Martoriello wrote:
On 19-Oct-2015 11:42 -0500, CRPence wrote:
On 19-Oct-2015 10:56 -0500, Mario Martoriello wrote:
I wrote, reading an old Scott Klement ‘s article, my own UDTF.
This  UDTF would return me a table. To define the UDTF I used
the following  code:
  Create Function RtvFattxCl
  ( cdcli   Char(6)
  , DatIni  Decimal(8, 0)
  , DatFin  Decimal(8, 0)
  )
<<SNIP>>
       external name 'MC_PTF/XVEX850(RTVFATTXCL)'
       program type sub
       language rpgle
<<SNIP>>
<<SNIP>> So the given example invocation should be modified for
testing, to do something like the following [where a1, a2, and a3
would be variables with data types either matching or compatible
types with the declared parameters, or with constant\literal
values which yield the desired type:
  select CC.* from TABLE(rtvfattxcl(a1, a2, a3)) AS CC
Note: Per the choice of CHAR() instead of VARCHAR() for the
parameter declaration of CDCLI, the first argument specified as a
[apostrophe-delimited] string constant will not resolve to that
function, because the implicit typing for a character string
constant is to a VARCHAR.  Generally best when possible, to define
the function [and code the matching procedure] to use varying
character instead. <<SNIP>>
<<SNIP>>
I wrote an wrong example because the exact call that I did is:
  select * from table(RTVFATTXCL('306803', 20120101)) as temp
The third parameter is optional and in the function I tried to
handle the null field.
  That the third parameter is optional to the external procedure is 
irrelevant in the given scenario, at least from the perspective of the 
SQL.  The parameter would need be defined as optional to the SQL, in 
order that the SQL interface should be accepting of the Function 
invocation without the third argument being specified.  That is because 
the CREATE FUNCTION is defining the interface to the SQL for both the 
program from the SQL to the ROUTINE [in this case FUNCTION] from the 
perspective of the SQL programmer.
  In the DB2 for i SQL vernacular, the _optional arguments_ are defined 
by the parameters that are declared with a DEFAULT value; i.e. they are 
not explicitly referred to as coding for Optional arguments or defining 
Optional parameters.  And AFaIK the capability is new to IBM i 7.2 [V7R2].
  So revisiting the originally offered routine [as table-function] 
source definition, the following revision to that statement is required 
to /make the 3rd parameter optional/; in this updated example, asking 
the SQL to pass the NULL value [indicator] in place of a value for the 
third argument, whenever the FUNCTION() invocation does not include the 
third parameter:
    Create Function RtvFattxCl
    ( cdcli   VarChar(6) /* use VARCHAR to alw tst w/ literals */
    , DatIni  Decimal(8, 0)
    , DatFin  Decimal(8, 0) DEFAULT NULL /* added DEFAULT *?
    ) [...]
[
http://www.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_72/sqlp/rbafyudfdft.htm]
_Defining UDFs with default parameters_
"You can define parameters for UDFs to have default values.
A default value for a parameter means that the parameter is not required 
on the function invocation. Using defaults allows flexibility by not 
requiring every invocation of a function to pass all parameter values. 
This can be useful when modifying existing functions.
 ..."
  With those two revisions, then on v7r2, the following invocation 
should be supported [given system-naming OPTION is established, and the 
PATH is *LIBL, and the routine RTVFATTXCL is defined in a SCHEMA name 
that exists in the *LIBL of the job invoking that FUNCTION]:
   select temp.* from table(RTVFATTXCL('306803', 20120101)) as temp
I tried also specifying the lib, alias schema, in which I registered
my function always with the same result (SQL0204)
  Fix the problems with the parameter definitions [and\or the argument 
specifications], and that issue will presumably be resolved; i.e. the 
function resolution is apparently failing not because of library [list] 
problems, but because of parameter\argument compatibility [and omission] 
problems.
About the first parameter that I defined Char() instead of varchar I
don't understand what you mean about apostrophe-delimited variable
  To be clear, "the first argument specified as a 
[apostrophe-delimited] string constant".  In the "exact call", the first 
argument is a "string constant"; in the SQL, a "string constant" is 
denoted by apostrophe-delimited text.  That string constant, specified 
as '306803' for the first argument in the "exact call", is data-typed by 
the SQL as being VARCHAR(6); thus when the SQL goes looking for a 
table-function with a compatible first-parameter, the SQL "Function 
Resolution" will look *only* for a function by the specified name with a 
VARCHAR() declared as the first parameter.
however I can change it to varchar .
  That will assist in testing, if using string literals [aka string 
constants] is desirable.  That is because the string-literal will be 
interpreted by the SQL as being VARCHAR, and thus the corresponding 
parameter type-definition [1st argument for the first parameter] will be 
compatible... and thus the Function Resolution can find a matching 
routine [aka Function] because both the function-name and the parameters 
will match; well, at least the first of the them will match with just 
the VARCHAR change, but unless a compatible argument is specific for all 
three parameters, then until the DEFAULT change is also effected for the 
third parameter definition, that 3rd argument can not be omitted.
As an Amazon Associate we earn from qualifying purchases.