MySQLのプロセス制御
理解
私の現在の接点、C、R、VB、Pythonのからのプログラミング言語は、JavaScript ...、 ビュー、より多くの何もないが、より高度なデータ構造の一部をカプセル化変数、式、フロー制御(シーケンシャル、ブランチ、ループ)、より多くの何も、言語機能やアプリケーションのシナリオことを除いて、実際には、ロジックは同じだけのソウルを手で調理されていません。
選択構造のif-else;ケース
-- if-esle 语法
IF search_condition THEN
statement_list;
[ELSEIF search_condition THEN
statement_list; ....]
ELSE
statement_list;
END IF;
-- CASE 语法
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE;
OR:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
-- 随机推送一句表白
drop procedure if exists sayLove;
delimiter //
create procedure sayLove()
begin
declare num int default 0;
-- 生成一个1-5间的随机数
set num := round(rand()*5);
-- 判断
case num
when 1 then select "人生若只如初见";
when 2 then select "春风十里不如你";
when 3 then select "爱你就像爱生命";
else
select "今晚的月色真美";
end case;
end //
delimiter ;
call sayLove();
-- out
mysql> call sayLove();
+----------------+
| 今晚的月色真美 |
+----------------+
| 今晚的月色真美 |
+----------------+
1 row in set (0.09 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call sayLove();
+----------------+
| 爱你就像爱生命 |
+----------------+
| 爱你就像爱生命 |
+----------------+
1 row in set (0.14 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call sayLove();
+----------------+
| 春风十里不如你 |
+----------------+
| 春风十里不如你 |
+----------------+
1 row in set (0.11 sec)
CASE IF-ELSE完全にでき、達成できるが、それはより多くの選択肢を提供しています。
-- 用 if-esle实现
drop procedure if exists sayLove;
delimiter //
create procedure sayLove()
begin
declare num int default 0;
-- 生成一个1-5间的随机数
set num := round(rand()*5);
-- 判断
if num=1 then select "人生若只如初见";
elseif num=2 then select "春风十里不如你";
elseif num-3 then select "爱你就像爱生命";
else
select "今晚的月色真美";
end if;
end //
delimiter ;
call sayLove();
MySQLのサイクル
- WHILEは... ... WHILE ENDを何「と、」サイクルタイプ、ループに入る前の状態に
- LOOPは... ... ENDのLOOP "を循環するまで、" LEAVE
- REPEAT ... UNTIL ... END REPEAT
しばらく...ん...ループ
while search_condition do
statement_list;
end while;
繰り返し...まで...ループ
repeat
statement_list;
until search_condition;
end repeat;
ループ...サイクルを残します
[begin_label:] loop
statement_list;
leave [begin_label];
end loop [end_label];
サイクル - ケース1 + 2 + ... n個
-- while 实现 求1+2+3+..n和
-- 自己容易混的点: 忘在结尾; end; 变量忘了 set;
-- 传入参数: in 传入值; out: 传入变量去接收返回的值; inout 传入又输出
drop procedure if exists sumN_while;
delimiter //
create procedure sumN_while(in n int)
begin
declare total int default 0;
declare i int default 0;
-- while ...do ....
while i <= n do
set total := total + i;
set i := i + 1;
-- 打印一下结果
end while;
select concat("1+2+..", n, "的和是:", total) as '输出啦';
end //
delimiter ;
call sumN_while(100);
-- out
call sumN_while(100);
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
+----------------------+
| 输出啦 |
+----------------------+
| 1+2+..100的和是:5050 |
+----------------------+
1 row in set (0.10 sec)
また、繰り返しと... ..、タイプパラメータの下で練習に活路を実現するまで、
-- repeat 实现 1+2+..n的和
drop procedure if exists sumN_repeat;
delimiter //
-- 设置传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(out total int)
begin
xxxx
end //
delimiter ;
drop procedure if exists sumN_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(in n int)
begin
declare i int default 0;
declare total int default 0;
-- repeat ... until ...
repeat
set total := total + i;
set i := i + 1;
-- 退出条件 until..True时才退出哦, 注意跟while的区别
until i > n
end repeat;
-- 在内部打印出结果
select total;
end //
delimiter ;
-- out
call sumN_repeat(100);
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
+-------+
| total |
+-------+
| 5050 |
+-------+
1 row in set (0.09 sec)
型パラメータを持つアウト。
-- repeat 实现 1+2+..n的和
drop procedure if exists sumN_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(in n int, out total int)
begin
declare i int default 0;
set total := 0; -- 顺序: 先decalre 再是set, 不能乱,兄弟
-- repeat ... until ...
repeat
set total := total + i;
set i := i + 1;
-- 退出条件 until..注意是条件为True时退出哦
until i > n
end repeat;
end //
delimiter ;
-- set @ret := 0;
-- call sumN_repeat(100, @ret);
-- select @ret;
-- out
mysql> set @ret := 0; -- 这个全局变量 @ret 用来接收过程的 total值哦
Query OK, 0 rows affected (0.00 sec)
mysql> call sumN_repeat(10000, @ret);
Query OK, 0 rows affected (0.04 sec)
mysql> select @ret;
+----------+
| @ret |
+----------+
| 50005000 |
+----------+
1 row in set (0.08 sec)
その後、ループが....全体の波に残します
-- loop ...leave ... 来实现 求 1+2+..n 的和
drop procedure if exists sumN_loop;
delimiter //
create procedure sumN_loop(in n int, out total int)
begin
declare i int default 0;
set total := 0;
-- loop, 先取一个标签名, 再写退出条件, if-then...
myLoop: loop
if i > n then
leave myLoop;
end if;
set total := total + i;
set i := i + 1;
end loop;
end //
delimiter ;
-- out
mysql> set @ret := 0;
Query OK, 0 rows affected (0.00 sec)
mysql> call sumN_loop(100, @ret);
Query OK, 0 rows affected (0.00 sec)
mysql> select @ret;
+------+
| @ret |
+------+
| 5050 |
+------+
1 row in set (0.11 sec)
概要MySQLの制御フロー
追加:ストアドプロシージャのパラメータ宣言
- タイプで:外の世界値からのパスを受けたときに呼び出す要求。
- タイプから:「戻り値」の手順を受け取る変数を渡して、呼び出す場合をリクエスト
- INOUTタイプ:入力 - 出力タイプ
補足:MySQLの変数定義
- 記憶プロセスにおいて、有する:変数名タイプ[デフォルト値]宣言;同様に、「ローカル変数」を
- 外部で実行、使用:変数@:;「:=」=値「グローバル変数」に似て、MySQLへの注意を払うには、標準の代入シンボルであり、「=」のみ更新とセットで割り当てを表し、シーンの残りの部分は「等号です。 "
- 選択構造(ケース、あれば):
- もし - elseif- esle末端であれば、
- ケース値ときに値1、次いで、ときvalue2の...そして...他.. エンドケース。
- ループ構造(一方、反復、ループ)
- しばらく....行う....エンド間;
- 繰り返し... ....エンドリピートまで。
- myLoop:ループ.....その後、myLoopを残して...場合。場合は終了。.....エンドループ;