単元概要

この単元では、ストアドファンクションの記述の仕方と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 [ストアドファンクション名]([引数]);

<例題>

  • もし、ファンクション名「fnc001_test」がすでにある場合には、削除すること。
  • ファンクション名「fnc001_test」で作成すること。
  • 引数
    • 引数名:std_no
    • 型:int
  • 処理
    1. 処理1:変数名「char_name」varchar(50)型を宣言すること。
    2. 処理2:変数名「char_name」に、下記方法で「生徒番号は「std_no」番です。」すること。
      • concat関数:concat([文字A],[文字B],[文字C])
  • 戻り値:変数名「char_name」
delimiter //

drop function if exists fnc001_test;
create function fnc001_test(std_no int) returns varchar(50) deterministic
begin
    declare char_name varchar(50);
    set char_name = concat('生徒番号は「',std_no,'」番です。');
    return char_name;
end;
//

delimiter ;
select fnc001_test(1);
select fnc001_test(sm.student_no) from student_mst sm;