The CREATE FUNCTION statement creates a Java function, which you can then use in an expression.
The function owner and the database owner automatically gain the EXECUTE privilege on the function, and are able to grant this privilege to other users. The EXECUTE privileges cannot be revoked from the function and database owners.
For details on how Derby matches procedures to Java methods, see Argument matching. For information on how functions interact with deferrable constraints, see Deferrable constraints.
CREATE FUNCTION functionName ( [ functionParameter [ , functionParameter ]* [...] ] ) RETURNS returnDataType [ functionElement ]*
An ellipsis (...) after the last parameter indicates that the Java method supports trailing optional arguments, called varargs. The ellipsis indicates that the method may be invoked with zero or more trailing values, all having the data type of the last argument.
A parameterName must be unique within a function.
The syntax of dataType is described in Data types.
The syntax of dataType is described in Data types.
This is the return type of a table function. Currently, only Derby-style table functions are supported. They are functions which return JDBC ResultSets. For more information, see "Programming Derby-style table functions" in the Derby Developer's Guide.
At runtime, as values are read out of the user-supplied ResultSet, Derby coerces those values to the data types declared in the CREATE FUNCTION statement. This affects values typed as CHAR, VARCHAR, LONG VARCHAR, CHAR FOR BIT DATA, VARCHAR FOR BIT DATA, LONG VARCHAR FOR BIT DATA, and DECIMAL/NUMERIC. Values which are too long are truncated to the maximum length declared in the CREATE FUNCTION statement. In addition, if a String value is returned in the ResultSet for a column of CHAR type and the String is shorter than the declared length of the CHAR column, Derby pads the end of the String with blanks in order to stretch it out to the declared length.
The syntax of dataType is described in Data types.
{ LANGUAGE JAVA | { DETERMINISTIC | NOT DETERMINISTIC } | EXTERNAL NAME singleQuotedString | PARAMETER STYLE { JAVA | DERBY_JDBC_RESULT_SET | DERBY } | EXTERNAL SECURITY { DEFINER | INVOKER } | { NO SQL | CONTAINS SQL | READS SQL DATA } | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT } }
The database manager will call the function as a public static method in a Java class.
DETERMINISTIC declares that the function is deterministic, meaning that with the same set of input values, it always computes the same result. The default is NOT DETERMINISTIC. Derby cannot recognize whether an operation is actually deterministic, so you must take care to specify this element correctly.
The singleQuotedString specified by the EXTERNAL NAME clause describes the Java method to be called when the function is executed.
Derby does not support long column types (for example, LONG VARCHAR, BLOB, and so on). An error will occur if you try to use one of these long column types.
If SQL authorization mode is enabled, a function runs by default with the privileges specified for the user who invokes the function (invoker's rights). To specify that the function should run with the privileges specified for the user who defines the function (definer's rights), create the function with EXTERNAL SECURITY DEFINER. Those privileges include the right to set the current role to a role for which the definer has privileges. When the function is first invoked, no role is set; even if the invoker has set a current role, the function running with definer's rights has no current role set initially.
See derby.database.sqlAuthorization for details about setting SQL authorization mode.
When a function with definer's rights is invoked, the current default schema is set to the eponymously named schema of the definer. For example, if the defining user is called OWNER, the default schema will also be set to OWNER.
When a function with invoker's rights is called, the current default schema and current role are unchanged initially within the function. Similarly, if SQL authorization mode is not enabled, the current default schema is unchanged initially within the function.
When the call returns, any changes made inside the function to the default current schema (and current role, if relevant) are reset (popped).
If SQL authorization mode is not enabled, an attempt to create a function with EXTERNAL SECURITY will result in an error.
Indicates whether the function issues any SQL statements and, if so, what type.
CREATE FUNCTION TO_DEGREES ( RADIANS DOUBLE ) RETURNS DOUBLE PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'java.lang.Math.toDegrees'
CREATE FUNCTION PROPERTY_FILE_READER ( FILENAME VARCHAR( 32672 ) ) RETURNS TABLE ( KEY_COL VARCHAR( 10 ), VALUE_COL VARCHAR( 1000 ) ) LANGUAGE JAVA PARAMETER STYLE DERBY_JDBC_RESULT_SET NO SQL EXTERNAL NAME 'vtis.example.PropertyFileVTI.propertyFileVTI'
CREATE FUNCTION maximum ( a INT ... ) RETURNS INT LANGUAGE JAVA PARAMETER STYLE DERBY NO SQL EXTERNAL NAME 'IntFunctions.maximum'