一、存储过程
存储过程实质上是sql里面的“函数”,调用了一个存储过程就可以完成一个功能。
存储过程一般为以下格式:
create procedure procedure_name(arg1,arg2...)
begin
...
...
end;
是不是想起了某些以begin和end来分块的编程语言呢?
不过值得一提的是,如果在脚本编辑器中,最好还是使用以下的格式:
delimiter //
create procedure procedure_name(arg1,arg2...)
begin
...
...
end//
delimiter ;
delimiter是分隔符的意思,先切换成//结尾就不会影响语句里的分号。
调用就更简单了。
call procedure_name(@x,@y,@z...);
传入参数并且使用。
参数有很大讲究,因为sql并不可以像java、c之类的语言返回一个值,而是把东西输入到函数中!
下面给出一个示例:
delimiter //
create procedure func(in num int,out ans varchar
)
begin
-- 声明一个变量
declare q double default 0.55;
-- 声明一个变量保存查询结果
declare t int;
-- 选出表中符合条件的最大值
select max(n) into t from tablename where field=num;
-- 构造一个查询结果字符串传递给ans
select concat('the',t*q,' is answer') into ans;
end//
delimiter ;
创建一个过程之后按照
call procedure_name(100,@answer10);
select answer10;
即可查看结果。
删除一个过程就是:drop procedure procedure_name;
二、触发器
触发器是当发生某个动作时就会触发某些指令。
这些动作包括insert,delete,update。
一般格式是:
create trigger trig_name (after/before delete/update/insert) on tablename
for each row...
将会创建一个根据六种动作(删除前,删除后,插入前,插入后,更新前,更新后)与某个表关联的触发器
特别注意的是触发器的动作可不允许用普通的select-from-where 语句,只能通过into放到某个变量中
delimiter //
create trigger trig after insert on customers
for each row
begin
declare n int;
select max(cust_id) from customers into n;
end//
delimiter ;
就像上面这样,单独使用select是会发生错误的。
在begin---end块里面可以使用new或者old变量
在delete中old是指被删除的一行;
在insert中new是指插入的一行;
update中new是更新后,old是更新前的一行。
三、存储过程里面的游标
游标声明在过程里面
declare cursor_name cursor
for
select...;
本质上是一个select语句返回的结果,对于多行的结果,通过repeat do until来迭代每条结果。
相当于把一个for循环在sql的服务器端处理,这种处理往往比客户端要快。