UDFs can define UDT arguments and return values, passing them by UDT handle. Here is an example of how to declare a scalar function that uses UDT types:
/***** C source file name: udfsamp.c *****/ #define SQL_TEXT Latin_Text #include <sqltypes_td.h> void do_something( UDT_HANDLE *aUDT, UDT_HANDLE *resultUDT, char sqlstate[6] ) { ... }
Suppose you create a structured UDT called circleUDT that you want to use as the input parameter and return type for the do_something function. The corresponding CREATE FUNCTION statement looks like this:
CREATE FUNCTION DO_SOMETHING(A circleUDT) RETURNS circleUDT LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!udfsamp!td_udf/udfsamp.c';
To use a dynamic UDT as the input parameter, the corresponding CREATE FUNCTION statement looks like this:
CREATE FUNCTION DO_SOMETHING(A VARIANT_TYPE) RETURNS circleUDT LANGUAGE C NO SQL PARAMETER STYLE TD_GENERAL EXTERNAL NAME 'CS!udfsamp!td_udf/udfsamp.c';
For details on the UDT_HANDLE C data type, see C Data Types.