Firebirdの標準関数を極める
アナハイムテクノロジー
はやしつとむ
2009/4/20
標準UDF関数
さて、これまでib_udfには38種類、fbudfには29種類の関数が定義されていました。これを、付属のib_udf.sqlやfbudf.sqlというスクリプトを実行することで、データベースごとに必要な(あるいはすべての)UDFを取り込んで利用するという形態だったわけです。
しかし、2.1でそのほとんどが内部関数として取り込まれたため、現在ではib_udfでは8種類の関数だけが利用価値があるとして、スクリプトもそのほとんどがコメントアウトされています。現在でも利用価値のあるものの一覧を以下に示します。
関数名 | フォーマット | 詳細 | 使用例 |
---|---|---|---|
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句で置き換えられました。
そのほか、日付時刻型の関数なども内部関数として取り込まれたので、そのほとんどは利用価値がなくなってしまいました。現在でも利用価値のあるものの一覧を以下に示します。
関数名 | フォーマット | 詳細 | 使用例 |
---|---|---|---|
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 |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|