站长资源数据库
MySQL中使用游标触发器的方法
简介游标select检索返回的一组行称为结果集,结果集里的行都是根据你输入的sql语句检索出来的,如果不使用游标,你将没有办法得到第一行,前十行或者是下一行下面是一些常见的游标现象和特性能够标记游标为只读,是数据能够读取,但不能被更新或者删除能控制可以执行的定向操作(向前,向后,第一,最后、绝对位置
游标
select检索返回的一组行称为结果集,结果集里的行都是根据你输入的sql语句检索出来的,如果不使用游标,你将没有办法得到第一行,前十行或者是下一行
下面是一些常见的游标现象和特性
- 能够标记游标为只读,是数据能够读取,但不能被更新或者删除
- 能控制可以执行的定向操作(向前,向后,第一,最后、绝对位置和相对位置等)
- 能标记某些行为可编辑的,而另一些行为不可编辑的
- 能规定范围,使游标对创建它的特定请求或者是所有请求可访问
- Cursor declarations must appear before handler declarations and after
- variable and condition declarations.
- 需要注意的是,打开一个游标时,游标并不指向第一条记录,而是指向第一条记录的前边
下面是使用游标的步骤
- 声明游标 – 在这个过程中你还没有开始检索数据
- 打开游标以供使用
- 检索各行
- 关闭游标,释放游标
DECLARE cs CURSOR FOR SELECT * FROM customers WHERE cust_email IS NULL;
本以为万事大吉,但却给我报错
从语法上来看没有什么问题
试着在 cs 前面加上@,运行仍然报错
还有人说游标只能在存储过程中使用,是这样吗?
现在我们来试一试在存储过程中使用游标
CREATE PROCEDURE proce1 () BEGIN DECLARE cur1 CURSOR FOR SELECT * FROM customers WHERE cust_id IS NULL tianyoutianyou; END
仍然出错
再次更改
delimiter // CREATE PROCEDURE proce1 () BEGIN DECLARE cur1 CURSOR FOR SELECT * FROM customers WHERE cust_id IS NULL; END
这次我们成功地声明游标
是不是因为我们修改了分隔符然我们成功地创建游标了呢?
我们再试试
CREATE PROCEDURE proce1() DECLARE cur1 CURSOR FOR SELECT * FROM customers WHERE cust_id IS NULL;
这样也是错误的,下面再试试不使用存储过程地语句能否成功创建游标
delimiter // DECLARE cur2 CURSOR FOR SELECT * FROM orders ;
或者是这样
delimiter // DECLARE cur2 CURSOR FOR SELECT * FROM orders //
这两种也8行
试了这么多次,唯一成功的只有下面这种语句
delimiter // CREATE PROCEDURE proce1() BEGIN DECLARE cur1 CURSOR FOR SELECT * FROM customers WHERE cust_id IS NULL; END
下面我们用游标来检索数据
很遗憾,MySQL中没有像Oracle中 %ROWTYPE 般的数据类型,我们下面试着使用游标来检索customers表中的某一类数据类型
触发器
触发器时特定的存储过程,在数据库发生特定活动时自动进行,一般来说,约束的处理比触发器更快,因此在可能的时候,应该尽可能地使用约束。