MySQL 存储过程

释放双眼,带上耳机,听听看~!

这篇文章基本都是使用存储过程的基础,可以来回味一下。

**定义:**一组为了完成特定功能的SQL 语句集。

优势:

A、 存储过程允许标准组件式编程

存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

B、 存储过程能够实现较快的执行速度

    如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

C、 存储过程减轻网络流量

对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

 D、 存储过程可被作为一种安全机制来充分利用

系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

 

创建存储过程:


1
2
3
4
5
1CREATE PROCEDURE  过程名
2([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])
3[特性 ...]
4过程体
5

IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

OUT:该值可在存储过程内部被改变,并可返回

INOUT:调用时指定,并且可被改变和返回

 

示例:

MySQL 存储过程

这个图中是一个简单的存储过程示例,因为涉及到生产数据库的一些表格,我给数据库表名称打了码,看一下大概的格式就好了。

 

控制语句:

 

这些语句都比较简单,就不一一写例子了,格式看完基本都会用了。

 

条件语句之IF语句:


1
2
3
4
5
6
7
8
9
10
1if 条件 then  
2
3statement
4
5 else
6
7  statement
8
9 end if;
10

 

条件语句之Case语句:


1
2
3
4
5
6
7
8
9
10
11
12
1CASE  expression
2
3   WHEN expression_1 THEN statement
4
5   WHEN expression_2 THEN statement
6
7   ...
8
9   ELSE statement
10
11END CASE;  
12

 

循环语句之while do语句:


1
2
3
4
5
6
7
8
9
10
11
12
1WHILE expression DO
2
3
4
5 statements
6
7
8
9 END WHILE
10
11
12

 

循环语句之REPEAT 语句


1
2
3
4
5
6
7
8
9
10
1REPEAT
2
3statements  
4
5UNTIL
6
7expression
8
9END REPEAT
10

 

循环语句之loop语句


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1declare i int defult 0;
2
3LOOP_LABLE:loop
4
5set i=i+1;
6
7if i<8 then
8
9Iterate loop_label;
10
11end if;
12
13if i>=10 then
14
15Leave loop_label;
16
17    end if;
18
19end loop loop_label;
20

 

leave 类似于break 语句,跳出循环

iterate 类似于continue ,结束本次循环

 

游标:


1
2
3
4
5
6
7
8
9
10
1定义游标:DECLARE cursor_name CURSORFOR SELECT_statement;
2
3打开游标:OPEN cursor_name;
4
5遍历游标:FETCH cursor_name INTO variable list;
6
7(FETCH是从第一行开始,获取当前行的数据,每次执行后会移动内部行指针,再次调用FETCH则会检索到下一行)
8
9关闭游标:CLOSE cursor_name;
10

 

事务控制:


1
2
3
4
1START TRANSACTION;  -- 开启事务
2
3COMMIT; -- 提交事务
4

 

 

示例代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
1DELIMITER //
2
3CREATE PROCEDURE `pro_withdraw`()
4
5COMMENT '提现对账'
6
7BEGIN
8
9DECLARE Done INT DEFAULT 0;
10
11DECLARE serverOrder VARCHAR(50);
12
13DECLARE wstatus VARCHAR(10);
14
15DECLARE failRe VARCHAR(200);
16
17DECLARE mbn VARCHAR(50);
18
19
20DECLARE orderList CURSOR FOR SELECT serverFlow,withdrawStatus,failReason,merBillNo from `withdraw_balance` where status='0';
21
22
23DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
24
25
26OPEN orderList;
27
28
29FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
30
31
32REPEAT
33
34IF NOT Done THEN
35
36start transaction;
37
38IF wstatus='F1' THEN
39
40update withdraw_confirm set status = -1 ,respCode='100000',summary=failRe where serverFlow=serverOrder and status ='1';
41
42Update user_withdraw set accept_result='N',accept_summary=failRe,opt_user='balance' where order_id=mbn;
43
44Update account_confirm set enable=-1 where serverFlow = serverFlow and enable='1' and trade_classify='cash';
45
46END IF;
47
48update  withdraw_balance set status =1 where serverFlow=serverOrder and status=0;
49
50END IF;
51
52commit;
53
54FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
55
56UNTIL Done END REPEAT;
57
58CLOSE orderList;
59
60END
61
62    //
63
64DELIMITER ;
65

 

声明语句结束符,可以自定义:


1
2
1DELIMITER //
2

 

以上文章多总结于网络

更详细内容可以查看此篇文章:http://www.runoob.com/w3cnote/mysql-stored-procedure.html

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索