这篇文章基本都是使用存储过程的基础,可以来回味一下。
定义:一组为了完成特定功能的SQL 语句集。
优势:
A、 存储过程允许标准组件式编程
存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。
B、 存储过程能够实现较快的执行速度
如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。
C、 存储过程减轻网络流量
对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。
D、 存储过程可被作为一种安全机制来充分利用
系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
创建存储过程:
CREATE PROCEDURE 过程名
([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])
[特性 ...]
过程体
IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT:该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回
示例:
这个图中是一个简单的存储过程示例,因为涉及到生产数据库的一些表格,我给数据库表名称打了码,看一下大概的格式就好了。
控制语句:
这些语句都比较简单,就不一一写例子了,格式看完基本都会用了。
条件语句之IF语句:
if 条件 then
statement
else
statement
end if;
条件语句之Case语句:
CASE expression
WHEN expression_1 THEN statement
WHEN expression_2 THEN statement
...
ELSE statement
END CASE;
循环语句之while do语句:
WHILE expression DO
statements
END WHILE
循环语句之REPEAT 语句
REPEAT
statements
UNTIL
expression
END REPEAT
循环语句之loop语句
declare i int defult 0;
LOOP_LABLE:loop
set i=i+1;
if i<8 then
Iterate loop_label;
end if;
if i>=10 then
Leave loop_label;
end if;
end loop loop_label;
leave 类似于break 语句,跳出循环
iterate 类似于continue ,结束本次循环
游标:
定义游标:DECLARE cursor_name CURSORFOR SELECT_statement;
打开游标:OPEN cursor_name;
遍历游标:FETCH cursor_name INTO variable list;
(FETCH是从第一行开始,获取当前行的数据,每次执行后会移动内部行指针,再次调用FETCH则会检索到下一行)
关闭游标:CLOSE cursor_name;
事务控制:
START TRANSACTION; -- 开启事务
COMMIT; -- 提交事务
示例代码:
DELIMITER //
CREATE PROCEDURE `pro_withdraw`()
COMMENT '提现对账'
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE serverOrder VARCHAR(50);
DECLARE wstatus VARCHAR(10);
DECLARE failRe VARCHAR(200);
DECLARE mbn VARCHAR(50);
DECLARE orderList CURSOR FOR SELECT serverFlow,withdrawStatus,failReason,merBillNo from `withdraw_balance` where status='0';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
OPEN orderList;
FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
REPEAT
IF NOT Done THEN
start transaction;
IF wstatus='F1' THEN
update withdraw_confirm set status = -1 ,respCode='100000',summary=failRe where serverFlow=serverOrder and status ='1';
Update user_withdraw set accept_result='N',accept_summary=failRe,opt_user='balance' where order_id=mbn;
Update account_confirm set enable=-1 where serverFlow = serverFlow and enable='1' and trade_classify='cash';
END IF;
update withdraw_balance set status =1 where serverFlow=serverOrder and status=0;
END IF;
commit;
FETCH NEXT FROM orderList INTO serverOrder,wstatus,failRe,mbn;
UNTIL Done END REPEAT;
CLOSE orderList;
END
//
DELIMITER ;
声明语句结束符,可以自定义:
DELIMITER //
以上文章多总结于网络
更详细内容可以查看此篇文章:http://www.runoob.com/w3cnote/mysql-stored-procedure.html