関数の所有者および、データベースの所有者は、自動的に関数へのEXECUTE権限を手に入れます。加えて、他のユーザへの権限付与の権限も手に入れます。関数とデータベースの所有者から、関数の実行権限を剥奪することはできません。
構文 CREATE FUNCTION 関数名 ( [ 関数の引数
[, FunctionParameter] ] * ) RETURNS 返却データ型 [ 関数の要素 ] *
関数名[ スキーマ名. ] SQL92識別子
スキーマ名が与えられなかった場合、デフォルトは現在のスキーマとなります。限定された関数名にて、スキーマ名はSYSで始まってはなりません。
関数の引数[ 引数名 ] データ型
引数名は関数にて一意である必要があります。
データ型の構文は、に書かれています。
CREATE FUNCTION文のパラメータにできないデータ型があります。それは、BLOB、CLOB、LONG VARCHAR、LONG VARCHAR FOR BIT DATAやXML等です。
返却データ型
表型 | データ型
表型
TABLE( 列要素 [, 列要素 ]* )
表関数の返り値の型です。現在利用できるのはDerbyの表関数の形式のみです。
これらはJDBCのResultSetを返す関数です。
より詳細な情報は、に記述された「Derbyの表関数のプログラミング」を参照してください。
列要素
SQL92識別子 データ型
データ型の構文は、に記述されています。
表関数から返却する情報の列の型を、XMLとすることはできません。
関数の要素 {
| LANGUAGE { JAVA }
| EXTERNAL NAME 文字列
| PARAMETER STYLE パラメータの種類
| { NO SQL | CONTAINS SQL | READS SQL DATA }
| { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
}
LANGUAGEJAVA- 関数はJavaのクラスにあるpublic staticなメソッドとして呼ばれます。
EXTERNAL NAME string文字列により、関数が実行されたときに呼ばれるJavaのメソッドが記述されます。この文字列は次の書式です。クラス名.メソッド名これは空白を含んではなりません。
パラメータの種類
JAVA | DERBY_JDBC_RESULT_SET
関数はJava言語およびSQLルーチンの仕様に沿って、引数を値渡しします。INOUTとOUTの引数は変更後の値を返せるように、要素がひとつの配列として渡されます。さらに結果セットはJavaのメソッドのパラメータを経て、配列に渡したjava.sql.ResultSet[]型の要素により返すことができます。
は長い列の型(これは例えばLong VarcharやBLOB等のことです。)をサポートしません。
これらの長い列の型を使おうとすると、エラーが発生します。
Derbyの表関数の場合、PARAMETER STYLEは常にDERBY_JDBC_RESULT_SETで、これ以外の値とすることはできません。表関数とは表型を返す関数で、JDBCのResultSetを返すメソッドに対応します。
それ以外の場合は、PARAMETER STYLEは常にJAVAです。
NO SQL, CONTAINS SQL, READS SQL DATA により関数がSQLを発行するか否か。もしするならどのようなSQLを発行するかを記述します。
- CONTAINS SQL
- 関数により変更も更新も行わないSQL文を実行できます。
関数にて許可されていない文が実行された場合、違うというエラーが返ります。
- NO SQL
- 関数はSQLを実行できません。
- READS SQL DATA
- 関数は情報の更新を行わないSQLを実行することができます。
関数にて許可されていない文が実行された場合、違うというエラーが返ります。
これは既定です。
RETURNS NULL ON NULL INPUT or CALLED ON NULL INPUT
入力の引数をnullにして関数が呼ばれるかをあらわします。その場合はnull値と扱います。
- RETURNS NULL ON NULL INPUT
- 入力の引数のうちいずれかがnullであった場合、関数は呼ばれません。そのときの帰り値はnullとなります。
- CALLED ON NULL INPUT
- 関数は入力の引数をnullにして呼ぶことができます。この場合は関数がnullの引数をとっても動作するようにコーディングされていなければなりません。関数はnullあるいはそれ以外の値を返すことができます。これは既定です。
関数の要素はどのような順序で現れてもかまいませんが、それぞれの要素は一回しか現れてはなりません。関数の定義にはこれらの要素が必要です。
- LANGUAGE
- PARAMETER STYLE
- EXTERNAL NAME
ExampleCREATE FUNCTION TO_DEGREES(RADIANS DOUBLE) RETURNS DOUBLE
PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA
EXTERNAL NAME 'java.lang.Math.toDegrees'