设为首页 收藏本站
查看: 568|回复: 0

[经验分享] MySQL存储过程之代码块、条件控制、迭代

[复制链接]

尚未签到

发表于 2016-10-20 09:21:17 | 显示全部楼层 |阅读模式
1,代码块
代码顺序

1,变量和条件声明
2,Cursor声明
3,Handler声明
4,程序代码

可以给代码块加lebel,这样END匹配比较直观,还可以用LEAVE语句来终结代码块:

[label:] BEGIN
varaiable and condition declarations
cursor declarations
handler declarations
program code
END [label];

代码块可以嵌套:

CREATE PROCEDURE nested_blocks()
BEGIN
DECLARE my_variable varchar(20);
SET my_variable='This value was set in the outer block';
BEGIN
SET my_variable='This value was set in the inner block';
END;
SELECT my_variable, 'Changes in the inner block are visible in the outer block';
END;

LEAVE的例子:

CREATE PROCEDURE nested_blocks()
outer_block: BEGIN
DECLARE l_status int;
SET l_status=1;
inner_block: BEGIN
IF (l_status=1) THEN
LEAVE inner_block;
END IF;
SELECT 'This statement will never be executed';
END inner_block;
SELECT 'End of program';
END outer_block;


2,条件控制
IF:

IF expression THEN commands
[ELSEIF expression THEN commands]
[ELSE commands]
END IF;

例子:

IF (sale_value > 200) THEN
CALL free_shipping(sale_id);    /*Free shipping*/
IF (customer_status='PLATINUM') THEN
CALL apply_discount(sale_id,20); /* 20% discount */
ELSEIF (customer_status='GOLD') THEN
CALL apply_discount(sale_id,15); /* 15% discount */
ELSEIF (customer_status='SILVER') THEN
CALL apply_discount(sale_id,10); /* 10% discount */
ELSEIF (customer_status='BRONZE') THEN
CALL apply_discount(sale_id,5); /* 5% discount*/
END IF;
END IF;

CASE:

CASE
WHEN condition THEN
statements
[WHEN condition THEN
statements...]
[ELSE
statements]
END CASE;

例子:

CASE
WHEN (sale_value>200) THEN
CALL free_shipping(sale_id);
CASE customer_status
WHEN 'PLATINUM' THEN
CALL apply_discount(sale_id,20);
WHEN 'GOLD' THEN
CALL apply_discount(sale_id,15);
WHEN 'SILVER' THEN
CALL apply_discount(sale_id,10);
WHEN 'BRONZE' THEN
CALL apply_discount(sale_id,5);
END CASE;
END CASE;

CASE与SELECT语句结合的妙用:

SELECT (CASE WHEN (t.a = 1 AND t.b = 0) THEN t.c ELSE 'N/A' END) AS result FROM test t order by result asc


3,迭代
LOOP

[label:] LOOP
statements
END LOOP [label];

REPEAT...UNTIL

[label:] REPEAT
statements
UNTIL expression
END REPEAT [label]

WHILE

[label:] WHILE expression DO
statements
END WHILE [label]

LEAVE语句

SET i=1;
myloop: LOOP
SET i=i+1;
IF i=10 then
LEAVE myloop;
END IF:
END LOOP myloop;
SELECT 'I can count to 10';

ITERATE语句

SET i=0;
loop1: LOOP
SET i=i+1;
IF i>=10 THEN                 /*Last number - exit loop*/
LEAVE loop1;
ELSEIF MOD(i, 2)=0 THEN       /*Even number - try again*/
ITERATE loop1;
END IF;
SELECT CONCAT(i, " is an odd number");
END LOOP loop1;

嵌套循环

DECLARE i, j INT DEFAULT 1;
outer_loop: LOOP
SET j=1;
inner_loop: LOOP
SELECT concat(i, " times ", j, " is ", i*j);
SET j=j+1;
IF j>12 THEN
LEAVE inner_loop;
END IF;
END LOOP inner_loop;
SET i=i+1;
IF i>12 THEN
LEAVE outer_loop;
END IF;
END LOOP outer_loop;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288745-1-1.html 上篇帖子: mysql备份数据丢失的问题很头痛 下篇帖子: MYSQL 里设置 int 型自增主键
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表