パッケージ org.opengion.fukurou.db

# クラス Functions

java.lang.Object
org.opengion.fukurou.db.Functions

public final class Functions extends Object
JavaDB(derby) や､hsqldb に対する､Javaの拡張組込み関数です｡ staticﾒｿｯﾄﾞとして､関数を定義します｡引数や返り値は､各ﾃﾞｰﾀﾍﾞｰｽの 定義に準拠します｡

     ① JavaDB の場合
     【概要】
         実行するﾃﾞｰﾀﾍﾞｰｽから見えるところに､ﾌｧｲﾙを配置する必要があります｡
         java8 までなら､Javaのｴｸｽﾃﾝｼｮﾝ(JAVA_HOME\)jre\lib\ext などですが､
         java9以降は､CLASSPATH に設定します｡
         openGionでは､bin/const.bat で､OG_CLASSPATH 環境変数にﾊﾟｽを通して､
         使用しています｡
         標準の Java staticﾒｿｯﾄﾞを FUNCTION 定義することも出来ます｡
     【設定】
         JavaDBに FUNCTION を定義します｡(ｻﾝﾌﾟﾙ)
          DROP FUNCTION TO_CHAR;

          CREATE FUNCTION TO_CHAR ( VAL DOUBLE )
          RETURNS VARCHAR(20)
          DETERMINISTIC           -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic)
          PARAMETER STYLE JAVA    -- 戻り値のﾀｲﾌﾟ
          NO SQL LANGUAGE JAVA    -- 関数の中でSQLは実行しないことを示す
          EXTERNAL NAME 'org.opengion.fukurou.db.Functions.toChar' ;

     ② HSQLDB の場合
     【概要】

変更履歴:
  6.8.5.1 (2018/01/15) org.opengion.javadb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更
機能分類
  拡張組込み関数
導入されたバージョン:
  JDK8.0,

- ## メソッドの概要

  修飾子とタイプ
  メソッド
  説明
  `static String`
  `checkDelay(String date1, String date2, double sec1, double sec2, double sec3)`
  日時文字列(yyyyMMddHHmmss)の引数1,2に対して､差分の範囲判定を行います｡ 範囲判定を行う引数 sec1､sec2､sec3 引数には､それぞれ(秒)ﾚﾍﾞﾙの値を指定します｡ 上記の引数の値が､0 の場合は､判定を回避します｡ sec1引数と比べて､小さければ 0 を､大きければ 1 を返します｡ sec2引数と比べて､小さければ sec1引数の結果を､大きければ 2 を返します｡ sec3引数と比べて､小さければ sec2引数の結果を､大きければ 3 を返します｡ 通常､sec1､sec2､sec3 と､順番に大きな値にしておきます｡ 小さいと判定された時点で､判定処理は終了します｡ date2 - date1 <= sec1 ⇒ 0 > sec1 ⇒ 1 > sec2 ⇒ 2 > sec3 ⇒ 3 date1,date2 のどちらかが､null,ｾﾞﾛ文字列の場合は､判定しません｡(return "0")
  `static String`
  `concat(String val1, String val2)`
  文字列を連結します｡ 文字列が､NULL の場合は､ｾﾞﾛ文字列として扱います｡ 引数がどちらも NULL の場合は､ｾﾞﾛ文字列が戻されます｡ これは､ORACLEとの互換性を考慮した関数です｡ ORACLE は､NULLとｾﾞﾛ文字列を同等にNULLとして扱うため､ COALESCE( VAL1,'' ) で､VAL1がNULLか､ｾﾞﾛ文字列の場合は､NULLが返されます｡ NULLを含むWHERE条件で､WHERE COALESCE( VAL1,'' ) = COALESCE( VAL2,'' ) としても､一致しないため､WHERE COALESCE( VAL1,'x' ) = COALESCE( VAL2,'x' ) とする必要がありますが､VAL1が､実際の 'x' で､VAL2がNULLの場合もﾏｯﾁします｡ 一方､Derbyでは､NULLとｾﾞﾛ文字列を区別するため､COALESCE( VAL1,'x' ) の VAL1の値が､NULLとｾﾞﾛ文字列で､結果が変わってしまいます｡ また､|| による文字列連結も､ORACLEとDerbyでは結果が変わるため､ CONCAT関数を作成して､ORACLEと同じSQL文での比較ができるようにしておきます｡ DROP FUNCTION CONCAT; CREATE FUNCTION CONCAT ( VARCHAR(1000) , VARCHAR(1000) ) RETURNS VARCHAR(2000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static int`
  `instr(String value, String sub)`
  部分文字列の出現位置を検索します｡ 第1引数の検索元の文字列と､第2引数の部分文字列を指定します｡ 戻り値は､Javaの indexOf とは異なり､+1 された値が返ります｡ DROP FUNCTION INSTR; CREATE FUNCTION INSTR ( VARCHAR(1000) , VARCHAR(100) ) RETURNS INTEGER DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static String`
  `join2(int no, String arg2, String arg3, String arg4)`
  特殊な文字列の連結を行います｡ これは､第1引数の数字と､第2､第3､第4の文字列をｽﾍﾟｰｽで連結した文字列を返します｡ 引数の個数が､可変に出来ないため､完全に決め打ちです｡ DROP FUNCTION JOIN2; CREATE FUNCTION JOIN2 ( INTEGER , VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static String`
  `join3(String sep, String arg2, String arg3, String arg4)`
  連結文字列を指定した､文字列の連結を行います｡ これは､第1引数の連結文字列を使用して､第2､第3､第4の文字列を連結します｡ 引数の個数が､可変に出来ないため､第2､第3､第4の文字列が､null か､ｾﾞﾛ文字列の 場合は､連結せずにﾊﾟｽします｡ DROP FUNCTION JOIN3; CREATE FUNCTION JOIN3 ( VARCHAR(10) , VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static int`
  `lengthb(String value)`
  length関数のﾊﾞｲﾄ数版 過去に､hsqldb 用に作成したJava関数です｡
  `static String`
  `nvl2(String inval, String val1, String val2)`
  NULL文字列の判定変換を行います｡ 文字列が､NULL(または空文字列)は､文字列2を､NULLでない場合は､文字列1を返します｡ Derbyでは､NULLと空文字列が区別されますが､ORACLE等では､区別されないため､ この関数でも区別しません｡ 空文字列の場合は､NULLと同じになります｡ DROP FUNCTION NVL2; CREATE FUNCTION NVL2 ( VARCHAR(1000) , VARCHAR(1000) , VARCHAR(1000) ) RETURNS VARCHAR(1000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static String`
  `replace(String source, String target, String replacement)`
  対象の文字列の部分文字列を置換します｡ ただし､source､target､replacement のどれかが､null(ｾﾞﾛ文字列)の場合は､ 処理を実行せず､source をそのまま返します｡ DROP FUNCTION REPLACE; CREATE FUNCTION REPLACE ( VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.
  `static String`
  `substrb(String value, int start, int length)`
  substr関数のﾊﾞｲﾄ数版 過去に､hsqldb 用に作成したJava関数です｡
  `static String`
  `toChar(double val)`
  数値を文字列に変換します｡ この関数は､引数の double が､小数点を含まない場合は､ 小数点以下を出しません｡ JavaDBの場合､数字と文字列の連結が出来ないため､文字列変換関数を用意します｡ DROP FUNCTION TO_CHAR; CREATE FUNCTION TO_CHAR ( VAL DOUBLE ) RETURNS VARCHAR(20) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.

  ### クラスから継承されたメソッド java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## メソッドの詳細

  - ### toChar

    public static String toChar(double val)
    数値を文字列に変換します｡ この関数は､引数の double が､小数点を含まない場合は､ 小数点以下を出しません｡ JavaDBの場合､数字と文字列の連結が出来ないため､文字列変換関数を用意します｡ DROP FUNCTION TO_CHAR; CREATE FUNCTION TO_CHAR ( VAL DOUBLE ) RETURNS VARCHAR(20) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.toChar' ;
    パラメータ:
      `val` - 文字列に変換すべき数値
    戻り値:
      変換した文字列
    変更履歴:
      6.7.3.0 (2017/01/27) 新規作成, 6.8.5.1 (2018/01/15) org.opengion.javadb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更, 6.9.8.0 (2018/05/28) FindBugs:浮動小数点の等価性のためのﾃｽﾄ

  - ### join2

    public static String join2(int no, String arg2, String arg3, String arg4)
    特殊な文字列の連結を行います｡ これは､第1引数の数字と､第2､第3､第4の文字列をｽﾍﾟｰｽで連結した文字列を返します｡ 引数の個数が､可変に出来ないため､完全に決め打ちです｡ DROP FUNCTION JOIN2; CREATE FUNCTION JOIN2 ( INTEGER , VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.join2' ;
    パラメータ:
      `no` - 第1引数の数字
      `arg2` - 第2引数
      `arg3` - 第3引数
      `arg4` - 第4引数
    戻り値:
      連結したした文字列
    変更履歴:
      6.7.3.0 (2017/01/27) 新規作成, 6.8.5.1 (2018/01/15) org.opengion.javadb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更

  - ### join3

    public static String join3(String sep, String arg2, String arg3, String arg4)
    連結文字列を指定した､文字列の連結を行います｡ これは､第1引数の連結文字列を使用して､第2､第3､第4の文字列を連結します｡ 引数の個数が､可変に出来ないため､第2､第3､第4の文字列が､null か､ｾﾞﾛ文字列の 場合は､連結せずにﾊﾟｽします｡ DROP FUNCTION JOIN3; CREATE FUNCTION JOIN3 ( VARCHAR(10) , VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.join3' ;
    パラメータ:
      `sep` - 連結時の文字列
      `arg2` - 第2引数
      `arg3` - 第3引数
      `arg4` - 第4引数
    戻り値:
      連結したした文字列
    変更履歴:
      8.0.2.0 (2021/11/30) 新規作成

  - ### replace

    public static String replace(String source, String target, String replacement)
    対象の文字列の部分文字列を置換します｡ ただし､source､target､replacement のどれかが､null(ｾﾞﾛ文字列)の場合は､ 処理を実行せず､source をそのまま返します｡ DROP FUNCTION REPLACE; CREATE FUNCTION REPLACE ( VARCHAR(2000) , VARCHAR(2000) , VARCHAR(2000) ) RETURNS VARCHAR(4000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.replace' ;
    パラメータ:
      `source` - 対象の文字列
      `target` - 置換したい文字列
      `replacement` - 置換する文字列
    戻り値:
      置換した文字列｡
    変更履歴:
      6.7.3.0 (2017/01/27) 新規作成, 6.8.5.1 (2018/01/15) org.opengion.javadb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更, 6.9.8.0 (2018/05/28) source､target､replacement のどれかが､null(ｾﾞﾛ文字列)の場合は､source を返す｡

  - ### substrb

    public static String substrb(String value, int start, int length) throws UnsupportedEncodingException
    substr関数のﾊﾞｲﾄ数版 過去に､hsqldb 用に作成したJava関数です｡
    パラメータ:
      `value` - 変換する文字列
      `start` - 変換開始ｱﾄﾞﾚｽ
      `length` - 変換ﾊﾞｲﾄ数
    戻り値:
      変換後文字列
    例外:
      `UnsupportedEncodingException` - 文字のｴﾝｺｰﾃﾞｨﾝｸﾞがｻﾎﾟｰﾄされていません｡
    変更履歴:
      6.8.5.1 (2018/01/15) org.opengion.hsqldb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更 ※ 現在未使用

  - ### lengthb

    public static int lengthb(String value) throws UnsupportedEncodingException
    length関数のﾊﾞｲﾄ数版 過去に､hsqldb 用に作成したJava関数です｡
    パラメータ:
      `value` - ﾊﾞｲﾄ数をｶｳﾝﾄする文字列
    戻り値:
      ﾊﾞｲﾄ数
    例外:
      `UnsupportedEncodingException` - 文字のｴﾝｺｰﾃﾞｨﾝｸﾞがｻﾎﾟｰﾄされていません｡
    変更履歴:
      6.8.5.1 (2018/01/15) org.opengion.hsqldb → org.opengion.fukurou.db にﾊﾟｯｹｰｼﾞ変更 ※ 現在未使用

  - ### checkDelay

    public static String checkDelay(String date1, String date2, double sec1, double sec2, double sec3)
    日時文字列(yyyyMMddHHmmss)の引数1,2に対して､差分の範囲判定を行います｡ 範囲判定を行う引数 sec1､sec2､sec3 引数には､それぞれ(秒)ﾚﾍﾞﾙの値を指定します｡ 上記の引数の値が､0 の場合は､判定を回避します｡ sec1引数と比べて､小さければ 0 を､大きければ 1 を返します｡ sec2引数と比べて､小さければ sec1引数の結果を､大きければ 2 を返します｡ sec3引数と比べて､小さければ sec2引数の結果を､大きければ 3 を返します｡ 通常､sec1､sec2､sec3 と､順番に大きな値にしておきます｡ 小さいと判定された時点で､判定処理は終了します｡ date2 - date1 <= sec1 ⇒ 0 > sec1 ⇒ 1 > sec2 ⇒ 2 > sec3 ⇒ 3 date1,date2 のどちらかが､null,ｾﾞﾛ文字列の場合は､判定しません｡(return "0")
    パラメータ:
      `date1` - 前比較日時文字列(yyyyMMddHHmmss)
      `date2` - 後比較日時文字列(yyyyMMddHHmmss)
      `sec1` - 比較する秒
      `sec2` - 比較する秒
      `sec3` - 比較する秒
    戻り値:
      判定結果
    変更履歴:
      7.0.5.0 (2019/09/16) 新規作成 ※ 現在未使用

  - ### instr

    public static int instr(String value, String sub)
    部分文字列の出現位置を検索します｡ 第1引数の検索元の文字列と､第2引数の部分文字列を指定します｡ 戻り値は､Javaの indexOf とは異なり､+1 された値が返ります｡ DROP FUNCTION INSTR; CREATE FUNCTION INSTR ( VARCHAR(1000) , VARCHAR(100) ) RETURNS INTEGER DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.instr' ;
    パラメータ:
      `value` - 検索元の文字列
      `sub` - 部分文字列
    戻り値:
      文字列が見つかった位置(最初が1 ､見つからなければ 0 )
    変更履歴:
      7.3.0.0 (2021/01/06) 新規追加

  - ### concat

    public static String concat(String val1, String val2)
    文字列を連結します｡ 文字列が､NULL の場合は､ｾﾞﾛ文字列として扱います｡ 引数がどちらも NULL の場合は､ｾﾞﾛ文字列が戻されます｡ これは､ORACLEとの互換性を考慮した関数です｡ ORACLE は､NULLとｾﾞﾛ文字列を同等にNULLとして扱うため､ COALESCE( VAL1,'' ) で､VAL1がNULLか､ｾﾞﾛ文字列の場合は､NULLが返されます｡ NULLを含むWHERE条件で､WHERE COALESCE( VAL1,'' ) = COALESCE( VAL2,'' ) としても､一致しないため､WHERE COALESCE( VAL1,'x' ) = COALESCE( VAL2,'x' ) とする必要がありますが､VAL1が､実際の 'x' で､VAL2がNULLの場合もﾏｯﾁします｡ 一方､Derbyでは､NULLとｾﾞﾛ文字列を区別するため､COALESCE( VAL1,'x' ) の VAL1の値が､NULLとｾﾞﾛ文字列で､結果が変わってしまいます｡ また､|| による文字列連結も､ORACLEとDerbyでは結果が変わるため､ CONCAT関数を作成して､ORACLEと同じSQL文での比較ができるようにしておきます｡ DROP FUNCTION CONCAT; CREATE FUNCTION CONCAT ( VARCHAR(1000) , VARCHAR(1000) ) RETURNS VARCHAR(2000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.concat' ;
    パラメータ:
      `val1` - 文字列1
      `val2` - 文字列2
    戻り値:
      文字列1と文字列2を連結した文字列
    変更履歴:
      7.3.0.0 (2021/01/06) 新規追加

  - ### nvl2

    public static String nvl2(String inval, String val1, String val2)
    NULL文字列の判定変換を行います｡ 文字列が､NULL(または空文字列)は､文字列2を､NULLでない場合は､文字列1を返します｡ Derbyでは､NULLと空文字列が区別されますが､ORACLE等では､区別されないため､ この関数でも区別しません｡ 空文字列の場合は､NULLと同じになります｡ DROP FUNCTION NVL2; CREATE FUNCTION NVL2 ( VARCHAR(1000) , VARCHAR(1000) , VARCHAR(1000) ) RETURNS VARCHAR(1000) DETERMINISTIC -- 引数が同じなら常に同じ値を返すことを示す.(省略時はnot deterministic) PARAMETER STYLE JAVA -- 戻り値のﾀｲﾌﾟ NO SQL LANGUAGE JAVA -- 関数の中でSQLは実行しないことを示す EXTERNAL NAME 'org.opengion.fukurou.db.Functions.nvl2' ;
    パラメータ:
      `inval` - 判定する文字列
      `val1` - invalがNULL(または空文字列)でない場合に返す文字列1
      `val2` - invalがNULL(または空文字列)の場合に返す文字列2
    戻り値:
      文字列がNULLの場合は､val2 を､そうでない場合は､val1 を返す｡
    変更履歴:
      7.3.1.3 (2021/03/09) 新規追加