CREATE [AGGREGATE] FUNCTIONfunction_name
RETURNS {STRING|INTEGER|REAL|DECIMAL} SONAMEshared_library_name
ユーザー定義関数 (UDF)
は、ABS()
や
CONCAT()
などのネイティブな (組み込みの) MySQL
関数のように機能する新しい関数によって
MySQL を拡張するための方法です。
function_name
は、この関数を呼び出すために SQL
ステートメントで使用される名前です。RETURNS
節は、この関数の戻り値の型を示します。DECIMAL
は RETURNS
のあとの正当な値ですが、現在
DECIMAL
関数は文字列値を返すため、STRING
関数のように記述してください。
shared_library_name
は、この関数を実装するコードを含む共有オブジェクトファイルのベース名です。
このファイルは、プラグインディレクトリに存在する必要があります。このディレクトリは、plugin_dir
システム変数の値で指定されます。
これは MySQL 5.1 での変更です。以前のバージョンの MySQL の場合、共有オブジェクトは、システムの動的リンカーによって検索される任意のディレクトリに配置できます。
関数を作成するには、mysql
データベースに対する
INSERT
権限が必要です。これが必要なのは、CREATE
FUNCTION
によって、関数の名前、型、および共有ライブラリ名を記録する
mysql.func
システムテーブルに行が追加されるためです。このテーブルがない場合は、mysql_upgrade
コマンドを実行して作成する必要があります。mysql_upgrade
を参照してください。
アクティブ関数とは、CREATE
FUNCTION
でロードされていて、DROP
FUNCTION
で削除されていない関数です。アクティブ関数はすべて、--skip-grant-tables
オプションで mysqld
を起動していないかぎり、サーバーが起動するたびに再ロードされます。この場合は、UDF
の初期化がスキップされ、UDF
は使用できません。
ユーザー定義関数を記述するための手順については、Adding a New User-Defined Function を参照してください。UDF のメカニズムが機能するには、関数を C か C++ (または、C の呼び出し規則を使用できる別の言語) で記述する必要があり、オペレーティングシステムが動的ロードをサポートしている必要があり、さらに mysqld を (静的にではなく) 動的にコンパイルしている必要があります。
AGGREGATE
関数は、SUM
や
COUNT()
などのネイティブな MySQL 集約 (集計)
関数のように正確に機能します。AGGREGATE
が機能するには、mysql.func
テーブルに type
カラムが含まれている必要があります。mysql.func
テーブルにこのカラムが含まれていない場合は、mysql_upgrade
プログラムを実行して作成する必要があります
(mysql_upgrade を参照)。
UDF
に関連付けられた共有ライブラリをアップグレードするには、DROP
FUNCTION
ステートメントを発行し、共有ライブラリをアップグレードしたあと、CREATE
FUNCTION
ステートメントを発行します。最初に共有ライブラリをアップグレードしてから
DROP FUNCTION
を使用すると、サーバーがクラッシュする可能性があります。