When you declare a function or procedure using CREATE FUNCTION/PROCEDURE, Derby does not verify whether a matching Java method exists. Instead, Derby looks for a matching method only when you invoke the function or procedure in a later SQL statement.
At that time, Derby searches for a public, static method having the class and method name declared in the EXTERNAL NAME clause of the earlier CREATE FUNCTION/PROCEDURE statement. Furthermore, the Java types of the method's arguments and return value must match the SQL types declared in the CREATE FUNCTION/PROCEDURE statement. The following may happen:
A procedure or function that takes varargs must resolve to a varargs Java method.
In mapping SQL data types to Java data types, Derby considers the following kinds of matches:
Derby resolves function and procedure invocations as follows:
Derby provides a tool, SignatureChecker, which can identify any SQL functions or procedures in a database that do not follow these argument matching rules. See the Derby Tools and Utilities Guide for details.
The following function...
CREATE FUNCTION TO_DEGREES ( RADIANS DOUBLE ) RETURNS DOUBLE PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'example.MathUtils.toDegrees'
...would match all of the following methods:
public static double toDegrees( double arg ) {...} public static Double toDegrees( double arg ) {...} public static double toDegrees( Double arg ) {...} public static Double toDegrees( Double arg ) {...}
Note that Derby would raise an exception if it found more than one matching method.
The following table shows how Derby maps specific SQL data types to Java data types.
SQL Type | Primitive Match | Wrapper Match |
---|---|---|
BOOLEAN | boolean | java.lang.Boolean |
SMALLINT | short | java.lang.Integer |
INTEGER | int | java.lang.Integer |
BIGINT | long | java.lang.Long |
DECIMAL | None | java.math.BigDecimal |
NUMERIC | None | java.math.BigDecimal |
REAL | float | java.lang.Float |
DOUBLE | double | java.lang.Double |
FLOAT | double | java.lang.Double |
CHAR | None | java.lang.String |
VARCHAR | None | java.lang.String |
LONG VARCHAR | None | java.lang.String |
CHAR FOR BIT DATA | byte[] | None |
VARCHAR FOR BIT DATA | byte[] | None |
LONG VARCHAR FOR BIT DATA | byte[] | None |
CLOB | None | java.sql.Clob |
BLOB | None | java.sql.Blob |
DATE | None | java.sql.Date |
TIME | None | java.sql.Time |
TIMESTAMP | None | java.sql.Timestamp |
XML | None | None |
User-defined type | None | Underlying Java class |