単元概要

この単元では、ストアドファンクションの記述の仕方と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. 処理1:変数名「char_name」varchar(50)型で初期値は「”(空)」を宣言すること。
    2. 処理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;