この単元では、ストアドファンクションの記述の仕方とSQL文をプログラム言語のように使うための基本を学びます。
単元概要
重要なポイント
sum/avg関数のような、簡単に使える自作関数ができる!
解説
基本構文
MySQLで記述する場合には「delimiter(デリミタ)」を記述します。
ストアドファンクションを作成する場合、引数を設定することができます。
※ストアドプロシージャと異なり、引数として「in/out」は不要です。
- 引数名
- ストアドファンクション内で利用できる値となります。
- 型
- 引数の型を設定できます。(例:int,varcharなど)
- deterministic / not deterministic
- deterministicは、入力値(引数)が同じ場合、戻り値が毎回同じになるパターンで使用。
- not deterministicは、入力値(引数)が同じ場合でも、戻り値が異なる可能性があるパターンで使用。
delimiter //
create function [ファンクション名]([引数名1] [型],[引数名2] [型]) returns [戻り値の型] [deterministic / not deterministic]
begin
[処理1];
[処理2];
return [戻り値];
end;
//
delimiter ;
/* ストアドファンクションを呼び出す */
select [ストアドファンクション名]([引数]);
<例題>
- もし、ファンクション名「fnc035_test」がすでにある場合には、削除すること。
- ファンクション名「fnc035_test」で作成すること。
- 引数
- 引数名:int_student_no
- 型:int
- 戻り値:varchar(50)で、入力値(引数)の値が同じ場合には、同じ結果が戻る
- 処理
- 処理1:変数名「char_name」varchar(50)型で初期値は「”(空)」を宣言すること。
- 処理2:変数名「char_name」に、下記方法で「生徒番号は「int_student_no」番です。」すること。
- concat関数:concat([文字A],[文字B],[文字C])
- 戻り値:変数名「char_name」
delimiter //
drop function if exists fnc035_test;
create function fnc035_test(int_student_no int) returns varchar(50) deterministic
begin
declare char_name varchar(50) default '';
set char_name = concat('生徒番号は「',int_student_no,'」番です。');
return char_name;
end;
//
delimiter ;
select fnc035_test(1);
select fnc035_test(sm.student_no) from student_mst sm;