Yet another OSS DB:Firebird(4)

Firebirdの標準関数を極める

Firebird日本ユーザー会
アナハイムテクノロジー
はやしつとむ
2009/4/20

標準UDF関数

 さて、これまでib_udfには38種類、fbudfには29種類の関数が定義されていました。これを、付属のib_udf.sqlやfbudf.sqlというスクリプトを実行することで、データベースごとに必要な(あるいはすべての)UDFを取り込んで利用するという形態だったわけです。

 しかし、2.1でそのほとんどが内部関数として取り込まれたため、現在ではib_udfでは8種類の関数だけが利用価値があるとして、スクリプトもそのほとんどがコメントアウトされています。現在でも利用価値のあるものの一覧を以下に示します。

ib_udfで利用価値のある関数一覧
関数名 フォーマット 詳細 使用例
div div(<数値>, <数値>) div(x, y)でxをyで割った商を返します select div(10, 3) from rdb$database;
frac frac(<数値>) 数値を切り上げて返します select frac(10.3) from rdb$database;
ltrim ltrim(<文字列>) 文字列の左側にある半角空白を除去します select ltrim('   hoge') from rdb$database;
rtrim rtrim(<文字列>) 文字列の右側にある半角空白を除去します select rtrim('hoge   ') from rdb$database;
srand srand() --- 引数無し 0〜1の間(両端を含みます)を返しますが、毎回c言語の標準ライブラリ関数 srand()を呼ぶため、連続した呼び出しの場合、同じ値を返してしまいます。

これは、以前のrand()関数の動作と同じです
select srand() from rdb$relations;
strlen strlen(<文字列>) 文字列の長さを返します select strlen('hoge') from rdb$database;
substr substr(<文字列>, <数値>, <数値>) substr(x, y, z)の場合、文字列xのy文字目からz文字までを返します select substr(rdb$relation_name, 2, 4) from rdb$relations;
substrlen substrlen(<文字列>, <数値>, <数値>) substrlen(x, y, z)の場合、文字列xのy文字目からz文字を返します select substrlen(rdb$relation_name, 2, 2) from rdb$relations;

注:frac()関数は、FB2.1.1までWindows版だけdllのエントリポイントが抜けていたため使用出来ませんでした。FB2.1.2からはWindowsでも使用出来ます。

 一方、fbudfの方はどうかというと、パラメータのデータ型に応じて4つあったnvl系関数はCOALESCE句で置き換えられました。また、同じく4つあったnullif系関数はNULLIF句で置き換えられました。

 そのほか、日付時刻型の関数なども内部関数として取り込まれたので、そのほとんどは利用価値がなくなってしまいました。現在でも利用価値のあるものの一覧を以下に示します。

fbudfで利用価値のある関数一覧
関数名 フォーマット 詳細 使用例
dow dow(<日付>) 日付から曜日を返します(長い形式) select dow('2009/3/22') from rdb$database;
sdow sdow(<日付>) 日付から曜日を返します(短い形式) select sdow('2009/3/22') from rdb$database;
getExactTimestamp
(win32 only)
getExactTimeStamp() より厳密な時刻を返します select exacttimestamp() from rdb$database;
getExactTimestampUTC
(win32 only)
getExactTimeStampUTC() より厳密な時刻を返します(UTC) select exacttimestampUTC() from rdb$database;
isLeapYear isleapyear(<日付>) 日付で指示された年がうるう年なら1をそうでなければ0を返します select isleapyear('2008/1/1') from rdb$database; --- return 1

 getExactTimestamp()とgetExactTimestampUTC()関数はWin32環境でのみ動作しますが、WindowsのOSとしてのクロック分解能から、ユニプロセッサ(1コア)では10ms、マルチプロセッサでは15ms程度になります。

getExactTimestampの実行結果

SQL>select getexacttimestamp() from accounts group by 1;

 GETEXACTTIMESTAMP
   =========================
   2009-03-22 21:48:08.1250
   2009-03-22 21:48:08.1400
   2009-03-22 21:48:08.1560
   2009-03-22 21:48:08.1710
   2009-03-22 21:48:08.1870
   2009-03-22 21:48:08.2030
   2009-03-22 21:48:08.2180
   2009-03-22 21:48:08.2340
   2009-03-22 21:48:08.2500
   2009-03-22 21:48:08.2650
   2009-03-22 21:48:08.2810
   2009-03-22 21:48:08.2960
   2009-03-22 21:48:08.3120

 余談になりますが、Windowsのクロック分解能は、マイクロソフトが配布しているSysinternalツール群の1つ、Clockresを使うと計測できます。

Clockresの実行結果

ClockRes - View the system clock resolution
By Mark Russinovich
SysInternals - www.sysinternals.com


The system clock interval is 15.625000 ms
【関連記事】
Windows管理者必携、Sysinternalsでシステムを把握する(Security&Trustフォーラム)
http://www.atmarkit.co.jp/fsecurity/column/ueno/43.html

 以上、Firebirdの標準UDFと内部関数について見てきました、かなりの数の関数が標準関数として用意されたので、「Firebirdは関数が少ない」というのは過去のものとなりました。また、UDF機構は依然として健在ですので、誰でも簡単に新しい関数を追加することが可能です。

【参考】
Firebird2.1ReleaseNotes Appendix A.
http://www.firebirdsql.org/rlsnotesh/rlsnotes210.html#rnfb210-appx-A

 次回はUDFの作成編へと進みたいと思います。

前のページへ 2/2

Index
Firebirdの標準関数を極める

Page 1
拡張された内部関数
内部関数の一覧
→ Page 2
標準UDF関数
Yet another OSS DB:Firebird


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間