数据库中游标的作用是什么?

数据库中游标的作用是什么?,第1张

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。 \x0d\x0a\x0d\x0a 我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的 *** 作,而不是一次对整个结果集进行同一种 *** 作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。 \x0d\x0a\x0d\x0a在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案——那就是使用游标。

不知道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

)

begin

open cur_arg for select * from tablename

end

调用

declare

cur_calling sys_refcursor

begin

p_temp_procedure(cur_calling) --这样这个游标就有值了

for rec_next in cur_calling loop

....

end loop

end

(2)在包头中申明一个游表类型,然后调用者申明一个这个类型的游标变量,传给返回游标的存储过程 ,存储过程out这个结果集,这种方法很麻烦.游标类型不能像索引表一样使用create or replace type方法来创建,所以只能在包中申明,并且需要使用/来执行,后面的存储过程才认这个游标类型.(不推荐,但是建议要知道并且要会这种方式,毕竟它有它存在的道理)

--定义全局变量

create or replace package pkg_package

as

type 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

)

is

begin

open cur_out_arg for select * from test

end

/

--调用

declare

cur_out_arg pkg_package.type_cursor

rec_arg pkg_package.type_record

begin

p_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


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

原文地址: https://outofmemory.cn/sjk/9254145.html

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

发表评论

登录后才能评论

评论列表(0条)

保存