Restrictions when passing arguments with distinct types to functions
Because Db2 enforces strong typing when you pass arguments to a function, you must follow certain rules when passing arguments with distinct types to functions.
Adhere to the following rules:
- You can pass arguments that have distinct types to a function
if either of the following conditions is true:
- A version of the function that accepts those distinct types is
defined.
This also applies to infix operators. If you want to use one of the five built-in infix operators (||, /, *, +, -) with your distinct types, you must define a version of that operator that accepts the distinct types.
- You can cast your distinct types to the argument types of the function.
- A version of the function that accepts those distinct types is
defined.
- If you pass arguments to a function that accepts only distinct
types, the arguments you pass must have the same distinct types as
in the function definition. If the types are different, you must
cast your arguments to the distinct types in the function definition.
If you pass constants or host variables to a function that accepts only distinct types, you must cast the constants or host variables to the distinct types that the function accepts.
The following examples demonstrate how to use distinct types as arguments in function invocations.
Example: Defining a function with distinct types as arguments: Suppose
that you want to invoke the built-in function HOUR with a distinct
type that is defined like this:
CREATE DISTINCT TYPE FLIGHT_TIME AS TIME; The
HOUR function takes only the TIME or TIMESTAMP data type as an argument,
so you need a sourced function that is based on the HOUR function
that accepts the FLIGHT_TIME data type. You might declare a function
like this: CREATE FUNCTION HOUR(FLIGHT_TIME)
RETURNS INTEGER
SOURCE SYSIBM.HOUR(TIME);Example: Casting
function arguments to acceptable types: Another way you can
invoke the HOUR function is to cast the argument of type FLIGHT_TIME
to the TIME data type before you invoke the HOUR function. Suppose
table FLIGHT_INFO contains column DEPARTURE_TIME, which has data type
FLIGHT_TIME, and you want to use the HOUR function to extract the
hour of departure from the departure time. You can cast DEPARTURE_TIME
to the TIME data type, and then invoke the HOUR function:
SELECT HOUR(CAST(DEPARTURE_TIME AS TIME)) FROM FLIGHT_INFO;Example:
Using an infix operator with distinct type arguments: Suppose
you want to add two values of type US_DOLLAR. Before you can do this,
you must define a version of the + function that accepts values of
type US_DOLLAR as operands:
CREATE FUNCTION "+"(US_DOLLAR,US_DOLLAR)
RETURNS US_DOLLAR
SOURCE SYSIBM."+"(DECIMAL(9,2),DECIMAL(9,2));
Because the US_DOLLAR type is based on the DECIMAL(9,2) type, the
source function must be the version of + with arguments of type DECIMAL(9,2).Example:
Casting constants and host variables to distinct types to invoke
a user-defined function: Suppose function CDN_TO_US is defined
like this:
CREATE FUNCTION EURO_TO_US(EURO)
RETURNS US_DOLLAR
EXTERNAL NAME 'CDNCVT'
PARAMETER STYLE SQL
LANGUAGE C; This means that EURO_TO_US accepts only
the EURO type as input. Therefore, if you want to call CDN_TO_US with
a constant or host variable argument, you must cast that argument
to distinct type EURO: SELECT * FROM US_SALES
WHERE TOTAL = EURO_TO_US(EURO(:H1)); SELECT * FROM US_SALES
WHERE TOTAL = EURO_TO_US(EURO(10000));