UDF
を実装するファイルは、サーバが動作するホスト上でコンパイルし、インストールする必要があります。ここでは、MySQL
ソースディストリビューションに含まれるサンプル
UDF ファイル udf_example.cc
を使用して、その手順について説明します。このファイルには以下の関数が定義されています。
metaphon()
は、文字列引数の
metaphon 文字列を返す。これは soudex
文字列と同種の文字列で、英語向けに精度が高められている。
myfunc_double()
は、その引数に含まれる文字の ASCII
値の合計を、その引数の長さの合計で割った値を返す。
myfunc_int()
は、その引数の長さの合計を返す。
sequence([const int])
は、番号が指定された場合はその番号から始まるシーケンス、指定されなかった場合は
1 から始まるシーケンスを返す。
lookup()
は、ホスト名に対応する IP 番号を返す。
reverse_lookup()
は、IP
番号に対応するホスト名を返す。文字列
"xxx.xxx.xxx.xxx"
または 4
つの数値をパラメータとして呼び出すことができる。
ダイナミックにロード可能なファイルは、以下のようなコマンドを使用して、共有オブジェクトファイルとしてコンパイルする必要があります。
shell> gcc -shared -o udf_example.so myfunc.cc
MySQL ソースツリーの sql
ディレクトリで以下のコマンドを実行するだけで、システムに合った適切なコンパイラオプションを知ることができます。
shell> make udf_example.o
make
が表示するコンパイルコマンドをほとんどそのまま使用できます。ただし、行末付近にある
-c
オプションは指定しないでください。また、行末に
-o udf_example.so
を追加してください(一部のシステムでは、-c
オプションをコマンドに残す必要があります)。
UDF
を含む共有オブジェクトをコンパイルしたら、それをインストールして、MySQL
に通知する必要があります。udf_example.cc
をコンパイルして共有オブジェクトを作成すると、udf_example.so
のような名前のファイルが生成されます(正確な名前はプラットフォームによって異なる可能性があります)。このファイルを
/usr/lib
などのダイナミックリンカ ld
の検索対象パスにコピーするか、または共有オブジェクトを置いたディレクトリをリンカ設定ファイル(たとえば
/etc/ld.so.conf
)に追加します。
多くのシステムでは、UDF
関数ファイルを置いたディレクトリを参照するように環境変数
LD_LIBRARY
または
LD_LIBRARY_PATH
を設定することもできます。システムで使用する必要がある変数については、dlopen
のマニュアルページを参照してください。それらの変数を
mysql.server
または
mysqld_safe
の起動スクリプトで設定し、mysqld
を再起動する必要があります。
ライブラリをインストールしたら、以下のコマンドを使用して、新しく追加した関数について
mysqld
に通知します。
mysql>CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
mysql>CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
mysql>CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
mysql>CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
mysql>CREATE FUNCTION reverse_lookup
->RETURNS STRING SONAME "udf_example.so";
mysql>CREATE AGGREGATE FUNCTION avgcost
->RETURNS REAL SONAME "udf_example.so";
関数を削除するには、DROP FUNCTION
を使用します。
mysql>DROP FUNCTION metaphon;
mysql>DROP FUNCTION myfunc_double;
mysql>DROP FUNCTION myfunc_int;
mysql>DROP FUNCTION lookup;
mysql>DROP FUNCTION reverse_lookup;
mysql>DROP FUNCTION avgcost;
CREATE FUNCTION
および DROP
FUNCTION
の各ステートメントは、mysql
データベースのシステムテーブル
func
を更新します。関数の名前、型、および共有ライブラリ名はこのテーブルに保存されます。関数を作成および削除するには、mysql
データベースに対する INSERT
特権および DELETE
特権を持っている必要があります。
すでに作成されている関数を CREATE
FUNCTION
を使用して追加してはいけません。関数を再インストールする必要がある場合は、まず
DROP FUNCTION
で関数を削除してから CREATE
FUNCTION
で再インストールします。たとえば新しいバージョンの関数を再コンパイルした場合に、この手順で再インストールして
mysqld
に新しいバージョンの関数を追加します。再インストールしなければ、サーバは古いバージョンの関数を使い続けます。
mysqld
を起動する際に
--skip-grant-tables
オプションが指定されていなかった場合、アクティブな関数はサーバが起動するたびに再ロードされます。オプションが指定されていた場合、UDF
の初期化は行われず、それを使用することはできません(アクティブな関数とは
CREATE FUNCTION
でロードされたが
DROP FUNCTION
による削除は行われていない関数)。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.