读书笔记 - Derby Reference Manual(二)

来源:互联网 发布:北上广打拼 知乎 编辑:程序博客网 时间:2024/05/22 06:36

四、CREATE FUNCTION statement
  Derby中,通过CREATE FUNCTION语句创建函数,当然,该函数实际还是通过调用Java类中的函数来实现相应的功能。

  函数的创建者与该数据库建立者默认获得函数的绝对控制权,且不可被剥夺。此外,还可授于其它用户执行函数的权力。

  函数名可以指定schema,但当函数内的处理过程属于某个特定的schema时,不能以SYS开头的字符串作为函数名的schema名(If a qualified procedure name is specified, the schema name cannot begin with SYS.)。

  函数参数类型不能为以下类型:BLOB, CLOB, LONG VARCHAR, LONG VARCHAR FOR BIT DATA, and XML。

  返回的数据类型可以为表类型(即普通的查询结果数据集,对应到Java中就是ResultSet)或者数据库数据类型。Java函数返回的数据将会被强制转换成CREATE FUNCTION语句中所描述的数据库数据类型,并对数据长度过长的按对应的数据库类型最长长度进行截短。其中,返回为表数据时,结果集中不应该有XML类型数据(XML is not allowed as the type of a column in the dataset returned by a table function.),而char与String长度比表列中的定义长度短时,Derby会在其后填补相应位空格以达到定义长度。

  函数体包含以下元素:
   {
  | LANGUAGE { JAVA }
  | DeterministicCharacteristic
  | EXTERNAL NAME string
  | PARAMETER STYLE ParameterStyle
  | { NO SQL | CONTAINS SQL | READS SQL DATA }
  | { RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT }
   }
  以上的各个元素排名不分先后,但其中LANGUAGE、PARAMETER STYLE、EXTERNAL NAME三个元素是必须的。
  LANGUAGE指定为JAVA,则数据库管理器会将该函数当成公有静态方法调用。
  EXTERNAL NAME指定将要被调用的Java方法的完整名称,即类名+方法名。
  DeterministicCharacteristic指定该函数是否可确定(输入相同的参数,输出的结果始终一致,为确定性函数;反之,为不确定性函数),这一点主要用于确定该函数可否用于索引计算列和索引视图等特性。默认指定为NOT DETERMINISTIC。因为Derby不会去判断某个操作的确定/不确定性,所以在指定函数为DETERMINISTIC时需谨慎。
  ParameterStyle指定参数类型.JAVA:普通数据库类型;DERBY_JDBC_RESULT_SET:表数据类型。
  可以指定函数中SQL语句的执行环境:NO SQL则表示不能运行任何SQL语句;CONTAINS SQL表示可以包含不读取、不修改SQL DATA的SQL语句;READS SQL DATA为默认设定,表示可以包含不修改SQL DATA的SQL语句。
  RETURNS NULL ON NULL INPUT表示任何参数为NULL时,函数不被调用,直接返回NULL;CALLED ON NULL INPUT为默认设定,即当存在参数为NULL时,函数依然被调用执行。

--------------------------------------

Example of declaring a scalar function

CREATE FUNCTION TO_DEGREES
( RADIANS DOUBLE )
RETURNS DOUBLE
PARAMETER STYLE JAVA
NO SQL LANGUAGE JAVA
EXTERNAL NAME 'java.lang.Math.toDegrees'

Example of declaring a table function


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'

原创粉丝点击