注:ストアード・プロシージャーは、バージョン5.0以降で使用できます。
ストアドプロシージャ:
複数のSQLステートメントが組み合わされて、コマンド「callxx」を使用することによってのみ実行できるコレクションになります。このコレクションはストアドプロシージャと呼ばれます。
ストレージは保存を意味し、プロセスはステップを意味します。
つまり、ストアドプロシージャは、一連のステップを要約して格納するコレクションです。
あらかじめ用意しておいたコマンドを自動実行できるため、処理効率が高くなります。
ただし、重要なデータを格納する場合、完全に検証されていないストアドプロシージャを実行することは非常に危険です。
ストアドプロシージャを作成します。
create procedure 存储过程名()
begin
SQL语句1
SQL语句2
end
最初から最後までの内容は、ストアード・プロシージャーの本体です。
区切り文字の問題:
ストアドプロシージャの内容は通常のSQLステートメントであるため、コマンドの最後に区切り文字;を追加する必要があります。
begin
sql1;
sql2;
end
このように、createprocedureコマンドはストアドプロシージャの不完全な状態で実行されます。MYSQLモニターにセパレーターを入力すると、内容に関係なく、セパレーターの前の部分が最初に実行されるためです。
解決策:セパレーターの設定を変更します
ストアドプロシージャを作成するときは、区切り文字を;から他の適合に変更する必要があります。通常は//を使用します。
delimiter //
例:displaytbおよびtb1を実行するためのストアドプロシージャを作成します
delimiter //
create procedure pr1()
begin
select * from tb;
select * from tb1;
end
//delimiter ;
ストアドプロシージャを実行します。
例:前の例のpr1を呼び出します
call pr1;
パラメータを使用してストアドプロシージャを作成します。
create procedure 存储过程名(参数名 数据类型);
例:売上高が指定された値以上であることを示すレコードを作成し、ストアドプロシージャを実行します
delimiter //
create procedure pr(d int)
begin
select * from tb where sales>=d;
end
call pr(200);
注:パラメーターの前に追加しても、同じ結果が得られます(d int)。
ストアドプロシージャの内容を表示します。
show create procedure pr;
ストアドプロシージャを削除する
drop procedure 存储过程名;
ストアド関数:ストアド関数は、基本的にストアドプロシージャと同じ考え方と操作方法です。ストアドプロシージャとの唯一の違いは、ストアド関数が実行後に値を返すことです。
保存された関数は関数として機能し、保存された関数を使用してカスタム関数を作成できます。したがって、格納された関数はユーザー定義関数とも呼ばれます。
ストアド関数によって返される値は、通常の関数としてselectやupdateなどのコマンドで使用できます。
create function 存储函数名(参数 数据类型)returns 返回值的数据类型
begin
SQL语句
return 返回值 表达式
end
変数を宣言します。
declare 变量名 变量类型;
変数に値を割り当てます:
a into b;//b=a;
演習:保存された関数を使用して標準の重みを計算する
標準重量=高さ*高さ(cm)* 22/10000
delimiter //
create function fu1(height int) returns double
begin
return height*height*22/10000;
end
//
delimiter;
select fu1(174);
演習:売上列の平均を返します
delimiter //
create function fun2() return double
begin
declare r double;
select avg(sales) into r from tb;
return r;
end
//
delimiter ;
select fun2();
ストアド関数の内容を表示します
show create function 存储函数名;
ストアド機能を削除する
drop function 存储函数名;
トリガー:テーブルで操作が実行された後、他のコマンドの実行をトリガーするメカニズム。
挿入、更新、削除などのコマンドを実行する場合、トリガーとして事前に設定されたアクションも実行されます。
トリガーは、処理の記録として、または処理が失敗した場合のバックアップとしてもよく使用されます。
トリガーが起動されたとき:
before:テーブルが処理される前に発生します
後:テーブルが処理された後にトリガーされます
テーブル処理の前に列の値を取得します:old.column_name
テーブル処理後に列の値を取得します: new.column name
ただし、コマンドによっては、一部の列値を取得したり、一部の列値を取得したりすることができます。
例:「テーブル内のレコードを削除すると、削除されたレコードは他のテーブルにコピーされます」トリガーを作成します。
削除されたレコードをtbに挿入するために、事前に空のテーブルtb1を作成します
create table tb1 like tb;
トリガーを作成し、tbを削除します
delimiter //
create trigger tr before delete on tb1 for each row
begin
insert into tb1(old.id,old.name,old.age);
end
//
delimiter ;
delete from tb1;
設定されたトリガーを確認します。
show triggers;
トリガーの削除:
drop trigger 触发器名;