MYSQL開発ストアドプロシージャ、トリガー

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
when1 then 
操作1;
when2 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のストアドプロシージャとトリガー参照して、お互いを確認し、理解を深めることができます。

おすすめ

転載: blog.csdn.net/weixin_36522099/article/details/108523279