Mysqlストレージプロセスの実戦

17573 ワード

Mysqlストレージプロセスの実戦
1.実戦事例1
1.1背景
teacherテーブルがあり、テーブル文は次のとおりです.
create table teacher
(id int(4) primary key not null unique auto_increment,
num int(10) not null unique,
name varchar(20) not null,
sex varchar(4) not null,
birthday datetime ,
address varchar(50));

挿入データの値は次のとおりです.
insert into teacher values
(1,1001,'Spark','m','1984-11-08','    '),
(2,1002,'Hadoop','w','1994-11-28','    '),
(3,1003,'Hive','m','1978-12-08','    '),
(4,1004,'HBase','w','1990-01-08','    ');

1.2次のようなニーズがある
ストレージ・プロシージャteacher_infoを作成します.要求:teacher_infoには3つのパラメータがあります.入力パラメータはteacher_idおよびtypeであり、出力パラメータはinfoである.ストレージ・プロシージャは、番号teacher_idに基づいてteacherテーブルのレコードを問い合わせる役割を果たす.typeが1である場合、名前は出力パラメータinfoに渡される.typeの値が2の場合、年齢を出力パラメータinfoに渡す.type値が他の値の場合、文字列Errorが返されます.ストレージ・プロシージャは次のとおりです.
delimiter //
	create procedure teacher_info(in teacher_id int,in type int,out info varchar(20))
		begin
		case type
		when 1 then 
			select name into info from teacher where id = teacher_id;
		when 2 then 
			select year(now())-year(birthday) into info from teacher where id = teacher_id;
		else
			select 'error' into info;
		end case;
		end //
delimiter ;
show create procedure;

mysqlコマンドラインで次のコマンドを実行します.
mysql> delimiter //
mysql> create procedure teacher_info(in teacher_id int,in type int,out info varchar(20))
    -> begin
    -> case type
    -> when 1 then
    -> select name into info from teacher where id = teacher_id;
    -> when 2 then
    -> select year(now())-year(birthday) into info from teacher where id = teacher_id;
    -> else
    -> select 'error' into info;
    -> end case;
    -> end //
Query OK, 0 rows affected (0.07 sec)

mysql> delimiter ;
  • 01.ストレージ・プロシージャを呼び出すにはcallキーワード
  • を使用する必要があります.
  • 02.出力パラメータは@タップ
  • でなければなりません.
    mysql> call teacher_info(2,1,@info);
    Query OK, 1 row affected (0.04 sec)
    
    mysql> select @info;
    +--------+
    | @info  |
    +--------+
    | Hadoop |
    +--------+
    1 row in set (0.00 sec)
    

    2.実戦事例2
    2.1コード
    DROP PROCEDURE IF EXISTS text;  
    delimiter //     
    create procedure text( out rtn int )
    begin  
        declare LoginId INT default 0;    #mysql  DECLARE                
        set rtn=1;    
        IF LoginId = 3  
    		THEN  set rtn=2;  
    		ELSEIF LoginId = 0  
    		THEN  set rtn=3;  
    		ELSE  set rtn=4;  
        END IF;  
    end //
    delimiter ;
    

    2.2実行結果
    mysql> call text(@rtn);  #      
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select @rtn;      #    
    +------+
    | @rtn |
    +------+
    |    3 |
    +------+
    1 row in set (0.01 sec)
    

    3.まとめ
    ストアド・プロシージャの利点:
  • 01.ストアド・プロシージャと関数は、データベースで定義されたSQL文のセットであり、定義されたSQL文を実行するためにこれらのストアド・プロシージャと関数を直接呼び出します.ストレージ・プロシージャと関数は、開発者が同じSQL文を繰り返し記述することを回避します.
  • 02.ストレージ・プロシージャと関数は、MySQLサーバに格納および実行され、クライアントとサーバのデータ転送を削減します.
  • 03.ストレージ・プロシージャは、ストレージ関数と同様に、SQL文とプロシージャ文からなるコード・クリップであり、アプリケーションや他のSQL文によって呼び出されます.特徴:
  • 記憶関数は、記憶関数自体が出力パラメータであるため、出力パラメータを持つことができない.ストレージ・プロシージャは、出力パラメータを持つことができます.
  • ストレージ関数は、call文を使用することなく、ストレージ関数を直接呼び出すことができる.ストレージ・プロシージャの呼び出しにはcall文が必要です.
  • ストレージ関数にはreturn文が含まれている必要がありますが、ストレージ中に含まれてはいけません.