讀書筆記 - Derby Reference Manual(二)

四、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'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章