MySQL のユーザー定義関数

ここでは MySQL のユーザー定義関数についてご説明します。

MySQL の ユーザー定義関数を作成する

MySQL でユーザー定義関数を作成するには、CREATE FUNCTION 文を使います。

CREATE FUNCTION 文の基本的な構文は次の通りです。

DELIMITER //
CREATE FUNCTION ユーザー定義関数名 (
	入力引数名 データ型
)
RETURNS 戻り値のデータ型
[NOT DETERMINISTIC | DETERMINISTIC]
BEGIN
	SQL ルーチンステートメント (RETURN 文を含む)
END//
DELIMITER ;

まず、ユーザー定義関数の定義の中でデフォルトの DELIMITER の ; を使うので、DELIMITER を定義の中で使わない他の文字(ここでは //)に変更します。

入力引数はオプショナルで、なくても大丈夫です。

CREATE FUNCTION 文では RETURNS 戻り値のデータ型SQL ルーチンステートメントの中の RETURN 戻り値; は必須です。

[NOT DETERMINISTIC | DETERMINISTIC] もオプショナルで、省略した場合は NOT DETERMINISTIC が使われます。

基本的な考え方としては、入力引数が同じであれば同じ結果になる場合、その関数は DETERMINISTIC で、そうでなければ NOT DETERMINISTIC です。

この [NOT DETERMINISTIC | DETERMINISTIC] は作成者が宣言するもので MySQL はチェックを行いません。

デフォルトでは、CREATE FUNCTION 文は DETERMINISTIC か、NO SQLか、READS SQL DATA を指定していないと次のようなエラーになります。


Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)


次のクエリーを実行して作成者が危険なイベントをバイナリーログに書き込まないと信用する設定にすることで、NOT DETERMINISTIC な関数を定義してもエラーが出なくなります。

SET GLOBAL log_bin_trust_function_creators = 1;

それでは、簡単なユーザー定義関数を作成してみます。

税込の値段を入力引数として渡して、税抜きの値段を返す get_before_tax_price という名前のユーザー定義関数を作成するには、次のようにできます。

DELIMITER //
CREATE FUNCTION get_before_tax_price (
	after_tax_price DECIMAL(13,2)
)
RETURNS DECIMAL(13,2)
DETERMINISTIC
BEGIN
	
    DECLARE before_tax_price DECIMAL(13,2);
    DECLARE sale_tax_percent DECIMAL(5,2) DEFAULT 10; -- 10%
    
    SET before_tax_price = IFNULL(after_tax_price, 0) * 100 / (sale_tax_percent + 100) ;
    RETURN  before_tax_price;
    
END//
DELIMITER ;

sale_tax_percent は 10% にしています。

12 行目で税抜きの金額を計算し、13 行目で before_tax_price を RETURN しています。


このクエリーを実行すると、get_before_tax_price という名前のユーザー定義関数が作成されます。

MySQL Workbench の Schemas タブをリフレッシュすると、Funcitons に get_before_tax_price ができているのがわかります。

MySQL のユーザー定義関数 1


MySQL の ユーザー定義関数を実行する

MySQL のユーザー定義関数は、組み込み関数と同様に SELECT 文 で使うことができます。

SELECT ユーザー定義関数名([引数1, 引数2, ...])
[FROM ...];

例えば、先ほど作成した before_tax_price 関数を実行するには、次のようにできます。

SELECT get_before_tax_price(1000);

このクエリーを実行すると、消費税が 10% の時の税込価格 1000 円の税抜き価格である 909.09 円が取得できていますね。

MySQL のユーザー定義関数 2

MySQL の ユーザー定義関数を削除する

MySQL でユーザー定義関数を削除するには、DROP FUNCTION 文を使います。

DDROP FUNCTION 文の構文は次の通りです。

DROP FUNCTION ユーザー定義関数名;

例えば、先ほど作成した get_before_tax_price という名前のユーザー定義関数を削除したいのであれば次のようにできます。

DROP FUNCTION get_before_tax_price;

このクエリーを実行すると get_before_tax_price ユーザー定義関数が削除されます。

MySQL のユーザー定義関数 3


DROP FUNCTION 文は、実行した時に指定したユーザー定義関数が存在しないとエラーになります。

指定したユーザー定義関数が存在する時のみ削除したい場合は、IF EXISTS を次のように追加します。

DROP FUNCTION IF EXISTS ユーザー定義関数名;

以上、MySQL のユーザー定義関数についてご説明しました。

© 2024 MySQL 入門