MYSQL開発ストアドプロシージャ、トリガー
1.ストアドプロシージャ
1.1ストアドプロシージャの定義と呼び出し
ストアドプロシージャは、特定の機能を実装するように設計されたSQLコードブロックと見なすことができます。ストアドプロシージャは作成時にコンパイルされており、実行して呼び出すと非常に効率的です。1回コンパイルし、複数回呼び出します。
利点:
①SQL言語の機能と柔軟性を
強化する②標準コンポーネントプログラミング
③実行速度を速くする
④ネットワークトラフィックを
削減するaccessアクセス権の制御を実現する
欠点:
①移植性が悪い②ストレージ
手順は単純なsqlステートメントには適していません。
③チーム開発は統一された基準であるべきである。
④ビジネスロジックが複雑な場合、ストアードプロシージャを使用する効果は明らかではありません。
concurrent同時アクセスが大きい場合、あまりにも多くの操作を含むストアドプロシージャを記述することは適切ではありません。
SQLステートメントのデフォルトのターミネーターを変更します; [mysqlでは、セミコロンがSQLステートメントのデフォルトのターミネーターです。ストアドプロシージャを作成すると、セミコロンが原因でエラーが報告されます。】【構文:delimiter %
】【ストアドプロシージャの作成後、デフォルトの終了文字をセミコロンに戻します。】
ストアドプロシージャを定義します。
-- 存在则删除【生产的时候慎用,以免误删除】
drop procedure if exists proc_name;
-- 创建存储过程
create procedure proc_name(参数1,参数2)
begin
sql sentences;
end;
-- 执行存储过程
call proc_name(参数1,参数2);
-- 创建一个无参数的存储过程
delimiter %
create procedure insert_proc()
begin
select * from test;
end%
delimiter ; -- 恢复默认结束符为分号;
-- 执行存储过程
call insert_proc() %
1.2ストアドプロシージャのパラメータの概要
パラメータ内:
-- in 参数:外部传值给存储过程使用
-- (in id int)
delimiter %
create procedure proc_id(in id int,in name char(20))
begin
insert into test values(id,name);
end%
出力パラメータ:
-- out 参数:将存储过程的执行结果回传给其他调用它的程序使用
-- (out name varchar(10))
delimiter %
create procedure proc_name(in var_id int,out var_name char(20))
begin
select name into @var_name from test where id=var_id;
select @var_name as '姓名';
end%
delimiter ;
実行前に、ローカル変数を宣言する必要があり、ローカル変数には、ストアドプロシージャの出力を受け取るための初期値を指定する必要があります。
inoutパラメータ:
-- inout参数:外部传值给存储过程使用,然后存储过程把执行结果回传给其他调用它的程序使用。
-- (inout num int)
delimiter %
create procedure proc_power(inout num int)
begin
set num=num*num;
select num;
end%
delimiter ;
ストアドプロシージャでの変数の使用:
-- 变量声明
create procedure proc_name()
begin
delcare var_name var_type [default 默认值];
sql语句
end;
delimiter %
drop procedure if exists proc_name%
create procedure proc_name(in var_id int)
begin
declare var_name char(20);
set var_name=(select name from test where id=var_id);
select var_name as name;
end%
delimiter ;
変数スコープ:
-- 内部存储过程的变量a对外部存储过程是不可见的
begin -- 外部存储过程
declare a int;
begin -- 内部存储过程
declare a int;
end;
end;
-- 创建存储过程
delimiter %
drop procedure if exists proc_test%
create procedure proc_test()
begin
declare a int default 1;
begin
declare a int default 2;
select a;
end;
select a;
end%
delimiter ;
-- 执行存储过程
call proc_test();
ご覧のとおり、最初のクエリ結果は内部ストアドプロシージャの変数で、2番目のクエリ結果は外部ストアドプロシージャの変数です。
フロー制御ステートメント:
①条件付きステートメント
-- 创建存储过程
delimiter %
drop procedure if exists bjdx%
create procedure bjdx(in a int,in b int)
begin
declare answer varchar(20);
if a>b then
set answer='a';
elseif a<b then
set answer='b';
else
set answer='ab';
end if;
select answer;
end%
delimiter ;
-- 执行存储过程
call bjdx(1,2);
②ケースステートメント
-- case语法
case col_name
when 值1 then
操作1;
when 值2 then
操作2;
else
操作3;
end case;
-- 输入1234得四季
delimiter %
drop procedure if exists proc_sea%
create procedure proc_sea(in sea int)
begin
declare season varchar(10);
case sea
when 1 then
set season='spring';
when 2 then
set season='summer';
when 3 then
set season='autumn';
when 4 then
set season='winter';
else
set season='no sea';
end case;
select season;
end%
delimiter ;
③ while\repeat\loop
ループ文【】while loop:最初に判断してからループ
-- while循环语法
while 条件表达式
do
循环体
end while;
-- 求前100个自然数的和
delimiter %
drop procedure if exists proc_sum%
create procedure proc_sum(in count int)
begin
declare s int;
declare i int;
set s=0;
set i=1;
while i<=count
do
set s=s+i;
set i=i+1;
end while;
select s;
end%
delimiter ;
-- 执行存储过程
call proc_sum(100);
ループを繰り返す:最初にループしてから判断する
-- repeat循环语法
repeat
循环体
until 条件
end repeat;
-- 求前100个自然数的和
delimiter %
drop procedure if exists proc_sum%
create procedure proc_sum(in count int)
begin
declare s int;
declare i int;
set s=0;
set i=0;
repeat
set i=i+1;
set s=s+i;
until i>=count
end repeat;
select s;
end%
delimiter ;
-- 执行存储过程
call proc_sum(100);
ループループ:最初にループしてから判断する
-- loop循环语法
loop_name:loop
循环体
if 条件 then -- 用一个if判断来结束循环
leave loop_name;
end if;
end loop;
-- 求前100个自然数的和
delimiter %
drop procedure if exists proc_sum%
create procedure proc_sum(in count int)
begin
declare s int;
declare i int;
set s=0;
set i=0;
loop_name:loop
set i=i+1;
set s=s+i;
if i>=count then
leave loop_name;
end if;
end loop;
select s;
end%
delimiter ;
-- 执行存储过程
call proc_sum(100);
ストアドプロシージャとその内容を表示します。
-- 查看某个存储过程的内容
show create procedure proc_name\G;
-- 查看所有的存储过程
show procedure status\G;
-- 删除存储过程:
drop procedure proc_name;
drop procedure if exists proc_name
-- 在一个存储过程中,允许调用另一个存储过程,但是不允许删除另一个存储过程。
2.トリガー
-- 创建触发器的格式
delimiter %
create trigger tri_name
[before | after] tri_event
on table_name | view_name | user_name | db_name
[for each row][when tri_condition]
sql语句
%
tri_event一般指DML语句,即insert delete update
deptテーブルのデータ行を削除するときに、empのデータを削除するトリガーを設計します。
-- 创建触发器
delimiter %
create trigger tri_emp_dept
after delete
on dept
for each row
delete from emp where deptno=OLD.id; -- OLD指旧行,即在dept表上执行delete操作所对应的行。
%
-- 测试触发器效果
delimiter ;
delete from dept where id=10;
トリガーの内容を
表示する:すべてのトリガーを表示します。
-- 删除触发器
drop trigger tri_name;
drop trigger if exists tri_name;
mysqlのストアドプロシージャとトリガーについてよく知らない場合は、ORACLEのストアドプロシージャとトリガーを参照して、お互いを確認し、理解を深めることができます。