mysql学习笔记——多行操作和触发器

一、存储过程

存储过程实质上是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的服务器端处理,这种处理往往比客户端要快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值