mysql之游标

mysql之游标,第1张

游标:能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行 *** 作的数据结构。

创建游标: CREATE FUNCTION 函数名称 (参数)RETURNS 数据类型 程序体

存储过程中使用游标的4个步骤:定义游标、打开游标、读取游标数据和关闭游标。

定义游标: DECLARE 游标名 CURSOR FOR 查询语句

打开游标: OPEN 游标名称;

读取游标数据: FETCH 游标名 INTO 变量列表;

关闭游标: CLOSE 游标名;

条件处理语句: DECLARE 处理方式[CONTINUE 或EXIT] HANDLER FOR 问题 *** 作;

流程控制语句:跳转语句(ITERATE语句和LEAVE语句)、循环语句(LOOP、WHILE、REPEAT)、条件判断语句(IF语句和CASE语句)

创建游标: CREATE FUNCTION 函数名称 (参数)RETURNS 数据类型 程序体

存储函数与存储过程很像,但有几个不同点:

1、存储函数必须返回一个值或者数据表,存储过程可以不返回。

2、存储过程可以通过CALL语句调用,存储函数不可以

3、存储函数可以放在查询语句中使用,存储过程不可以

4、存储过程的功能更强大,包括能够执行对表的 *** 作(比如创建表、删除表等)和事务 *** 作

游标 *** 作步骤包含4个:定义游标、打开游标、读取游标数据和关闭游标。

1、创建存储过程

从字面可以这么理解什么是游标,游标就像是水面上漂浮的一个标记,这个标记可以来回游动,一会游到这里一会游到那里,这里的河水可以理解为是数据的集合,这个标记就是在这些数据间来回游动。

为什么 MySQL 会有游标这个概念,由于 SQL 语言是面向集合的语句,它每次查询出来都是一堆数据的集合,没有办法对其中一条记录进行单独的处理。如果要对每条记录进行单独处理就需要游标。

游标其实就像是编程语言中的 for/foreach 循环,把一个数组(数据的集合)中每条数据一条一条地循环出来,然后你在 for/foreach 循环中使用判断语句对你感兴趣的数据进行处理。

哪里可以使用游标呢,函数,存储过程,触发器中都可以使用。

说完概念,就来看下游标的固定写法。不管概念是否理解,记住下面的固定模式也可以完成搬砖任务。

1、声明游标

SELECT 语句就是正常的查询语句,例如:SELECT id,age FROM table

2、打开游标

在打开游标之前,游标定义的 SQL 语句是不执行的。

3、取出记录

将当前的记录数据存入变量。

当 FETCH 没有找到记录时会抛出异常,异常的定义需要下面的 HANDLER FOR 语句。

声明游标语句中的 SELECT 如果有多个字段,INTO 后面需要多个变量进行接收。

4、设置结束条件

这个语句的作用是指定一个条件,告诉程序所有数据已经循环完毕,可以结束了。由于游标是使用 WHILE 循环进行每条数据的读取,就需要给 WHILE 一个结束条件。

处理种类:可以是, EXIT 立即结束。CONTINUE 继续下面的处理。

异常的类型:一般指定为 NOT FOUND ,意思是没有找到任何数据。

异常发生时的处理:当异常发生时需要做的事情,这里一般改变一个变量的值来记录异常已经发生了,如如 SET flat = 1 详细用法查看下面的例子。

5、关闭游标

实战代码:

完毕,看懂没,如果没看懂没关系,游标处理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。

不知道mysql这个跟oracle里面,是不是一致的,下面是我学习的时候总结的如果一个过程要返回一个结果集,那么要引用游标来处理这个结果集。create or replace procedure Test(varEmpName emp.ename%type)As begin ------会报错.错误原因没有into子句.select * from emp where ename like '%'||varEmpName||'%'end这个程序我们无法用into,因为在Oracle里面没有一个类型去接受一个结果集.这个时候我们可以声明游标对象去接受他.有俩种方法:一种是声明系统游标,一种是声明自定义游标,然后后面 *** 作一样,参数类型为in out 或out(1)声明个人系统游标.(推荐)create or replace p_temp_procedure(cur_arg out sys_refcursor--方法1)beginopen cur_arg for select * from tablenameend调用declarecur_calling sys_refcursorbeginp_temp_procedure(cur_calling) --这样这个游标就有值了for rec_next in cur_calling loop ....end loopend(2)在包头中申明一个游表类型,然后调用者申明一个这个类型的游标变量,传给返回游标的存储过程 ,存储过程out这个结果集,这种方法很麻烦.游标类型不能像索引表一样使用create or replace type方法来创建,所以只能在包中申明,并且需要使用/来执行,后面的存储过程才认这个游标类型.(不推荐,但是建议要知道并且要会这种方式,毕竟它有它存在的道理)--定义全局变量create or replace package pkg_packageastype type_cursor is ref cursor type type_record is record(test01 varchar2(32),test02 varchar2(32),test03 varchar2(32))end/--创建返回游标的存储过程create or replace procedure p_temp_procedure(cur_out_arg out pkg_package.type_cursor)isbeginopen cur_out_arg for select * from testend/--调用declarecur_out_arg pkg_package.type_cursor rec_arg pkg_package.type_recordbeginp_temp_procedure(cur_out_arg) fetch cur_out_arg into rec_arg dbms_output.put_line(rec_arg.test01) dbms_output.put_line(rec_arg.test02) dbms_output.put_line(rec_arg.test03)end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8732488.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存