游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段。
使用游标的基本步骤:
1、声明游标。把游标与T-SQL语句的结果集联系起来。
2、打开游标。
3、使用游标 *** 作数据。
4、关闭游标。
功能:
1、游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
2、游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
3、游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
种类:
1、Transact_SQL游标
Transact_SQL游标是由DECLARECURSOR语法定义、主要用在Transact_SQL脚本、存储过程和触发器中。Transact_SQL游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL语句或是批处理、存储过程、触发器中的Transact_SQL进行管理。Transact_SQL游标不支持提取数据块或多行数据。
2、API游标
API游标支持在OLEDB,ODBC以及DB_library中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API游标函数,MSSQLSEVER的OLEDB提供者、ODBC驱动器或DB_library的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。
3、客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标 *** 作。由于API游标和Transact-SQL游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。
因为我们做的数据量大,而且系统上跑的不只我们一个业务。所以,我们都要求尽量避免使用游标,游标使用时会对行加锁,可能会影响其他业务的正常进行。而且,数据量大时其效率也较低效。另外,内存也是其中一个限制。
因为游标其实是相当于把磁盘数据整体放入了内存中,如果游标数据量大则会造成内存不足,内存不足带来的影响大家都知道了。
所以,在数据量小时才使用游标。
一> 游标是什么:\x0d\游标字面理解就是游动的光标。\x0d\用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标\x0d\用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行 *** 作,例如提取当前\x0d\行的数据等等。\x0d\二> 游标的分类:\x0d\显式游标和隐式游标\x0d\\x0d\显示游标的使用需要4步:\x0d\1声明游标\x0d\\x0d\CURSOR mycur(vartype number) is\x0d\select emp_no,emp_zc from cus_emp_basic \x0d\where com_no = vartype;\x0d\\x0d\2打开游标\x0d\open mycur(000627) 注:000627:参数\x0d\\x0d\3读取数据\x0d\fetch mycur into varno,varprice;\x0d\\x0d\4关闭游标\x0d\close mycur;\x0d\三> 游标的属性\x0d\oracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNT\x0d\\x0d\%ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false\x0d\%FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false\x0d\%ROWCOUNT 返回当前位置为止游标读取的记录行数。\x0d\\x0d\四> 示例:\x0d\\x0d\set serveroutput on;\x0d\declare\x0d\varno varchar2(20);\x0d\varprice varchar2(20);\x0d\\x0d\CURSOR mycur(vartype number) is\x0d\select emp_no,emp_zc from cus_emp_basic \x0d\where com_no = vartype;\x0d\begin\x0d\\x0d\if mycur%isopen = false then\x0d\\x0d\open mycur(000627);\x0d\end if;\x0d\fetch mycur into varno,varprice;\x0d\while mycur%found \x0d\loop\x0d\dbms_outputput_line(varno||','||varprice);\x0d\if mycur%rowcount=2 then\x0d\exit;\x0d\end if;\x0d\fetch mycur into varno,varprice;\x0d\\x0d\end loop;\x0d\close mycur;\x0d\\x0d\end;\x0d\\x0d\pl/sql 记录 的结构和c语言中的结构体类似,是由一组数据项构成的逻辑单元。\x0d\pl/sql 记录并不保存再数据库中,它与变量一样,保存再内存空间中,在使用记录时候,要首先定义记录结构\x0d\,然后声明记录变量。可以把pl/sql记录看作是一个用户自定义的数据类型。\x0d\\x0d\set serveroutput on;\x0d\declare\x0d\\x0d\type person is record\x0d\(\x0d\empno cus_emp_basicemp_no%type,\x0d\empzc cus_emp_basicemp_zc%type);\x0d\\x0d\person1 person;\x0d\\x0d\cursor mycur(vartype number)is\x0d\select emp_no,emp_zc from cus_emp_basic \x0d\where com_no=vartype;\x0d\\x0d\begin\x0d\if mycur%isopen = false then\x0d\open mycur(000627);\x0d\end if;\x0d\\x0d\loop\x0d\fetch mycur into person1;\x0d\exit when mycur%notfound;\x0d\dbms_outputput_line('雇员编号:'||person1empno||',地址:'||person1empzc);\x0d\end loop;\x0d\close mycur;\x0d\end;\x0d\\x0d\典型游标for 循环\x0d\\x0d\游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行\x0d\数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取\x0d\游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)\x0d\\x0d\使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。\x0d\\x0d\set serveroutput on;\x0d\declare\x0d\\x0d\cursor mycur(vartype number)is\x0d\select emp_no,emp_zc from cus_emp_basic \x0d\where com_no=vartype;\x0d\\x0d\begin\x0d\\x0d\for person in mycur(000627) loop\x0d\\x0d\dbms_outputput_line('雇员编号:'||personemp_no||',地址:'||personemp_zc);\x0d\end loop;\x0d\\x0d\end;
游标就是一个指针,查询一个结果集,这个指针可以指向结果集中任何一条记录。可以理解为指向结果集记录的指针,但是只能返回一行记录,如果需要多行就需要使用LOOP语句。
数据库有三种模式:模式、外模式、内模式。
通俗来讲模式就是开发人员通过需求设计一个逻辑结构。外模式就是用户面对的某一部分。内模式就是存储介质上存储方式的物理结构。
游标 其实就像是指针的东西 在你查询结果集的时候 游标是在第一条结果的前面 这样当你拨动游标的时候 他会向下移动一个位置 指向第二条记录 这样就会 读取出结果集中说有数据 比如 在C#中的read()方法 和java中的 next() 都是拨动游标的方法 我说的可能不太形象 楼主可以把它当做链表的指针 呵呵 楼主看看这里比较详细
>
以上就是关于什么是游标使用游标的基本步骤是什么全部的内容,包括:什么是游标使用游标的基本步骤是什么、oracle数据库中的游标有什么作用优点和缺点分别是什么、PL、SQL的游标怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)