这篇文章基本都是使用存储过程的基础,可以来回味一下。
**定义:**一组为了完成特定功能的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:调用时指定,并且可被改变和返回
示例:
这个图中是一个简单的存储过程示例,因为涉及到生产数据库的一些表格,我给数据库表名称打了码,看一下大概的格式就好了。
控制语句:
这些语句都比较简单,就不一一写例子了,格式看完基本都会用了。
条件语句之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