Ⅰ sql必知必会(游标)
第一步,定义游标。
第二步,打开游标。
第三步,从游标中取得数据。
第四步,关闭游标。
最后一步,释放游标。
你会发现执行 call calc_hp_max() 这一句的时候系统会提示 1329 错误,也就是在 LOOP 中当游标没有取到数据时会报的错误。
使用游标来解决一些常见的问题
Ⅱ PL、SQL的游标怎么用
一> 游标是什么:x0dx0a游标字面理解就是游动的光标。x0dx0a用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标x0dx0a用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前x0dx0a行的数据等等。x0dx0a二> 游标的分类:x0dx0a显式游标和隐式游标x0dx0ax0dx0a显示游标的使用需要4步:x0dx0a1.声明游标x0dx0ax0dx0aCURSOR mycur(vartype number) isx0dx0aselect emp_no,emp_zc from cus_emp_basic x0dx0awhere com_no = vartype;x0dx0ax0dx0a2.打开游标x0dx0aopen mycur(000627) 注:000627:参数x0dx0ax0dx0a3.读取数据x0dx0afetch mycur into varno,varprice;x0dx0ax0dx0a4.关闭游标x0dx0aclose mycur;x0dx0a三> 游标的属性x0dx0aoracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNTx0dx0ax0dx0a%ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于falsex0dx0a%FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于falsex0dx0a%ROWCOUNT 返回当前位置为止游标读取的记录行数。x0dx0ax0dx0a四> 示例:x0dx0ax0dx0aset serveroutput on;x0dx0adeclarex0dx0avarno varchar2(20);x0dx0avarprice varchar2(20);x0dx0ax0dx0aCURSOR mycur(vartype number) isx0dx0aselect emp_no,emp_zc from cus_emp_basic x0dx0awhere com_no = vartype;x0dx0abeginx0dx0ax0dx0aif mycur%isopen = false thenx0dx0ax0dx0aopen mycur(000627);x0dx0aend if;x0dx0afetch mycur into varno,varprice;x0dx0awhile mycur%found x0dx0aloopx0dx0adbms_output.put_line(varno||','||varprice);x0dx0aif mycur%rowcount=2 thenx0dx0aexit;x0dx0aend if;x0dx0afetch mycur into varno,varprice;x0dx0ax0dx0aend loop;x0dx0aclose mycur;x0dx0ax0dx0aend;x0dx0ax0dx0apl/sql 记录 的结构和c语言中的结构体类似,是由一组数据项构成的逻辑单元。x0dx0apl/sql 记录并不保存再数据库中,它与变量一样,保存再内存空间中,在使用记录时候,要首先定义记录结构x0dx0a,然后声明记录变量。可以把pl/sql记录看作是一个用户自定义的数据类型。x0dx0ax0dx0aset serveroutput on;x0dx0adeclarex0dx0ax0dx0atype person is recordx0dx0a(x0dx0aempno cus_emp_basic.emp_no%type,x0dx0aempzc cus_emp_basic.emp_zc%type);x0dx0ax0dx0aperson1 person;x0dx0ax0dx0acursor mycur(vartype number)isx0dx0aselect emp_no,emp_zc from cus_emp_basic x0dx0awhere com_no=vartype;x0dx0ax0dx0abeginx0dx0aif mycur%isopen = false thenx0dx0aopen mycur(000627);x0dx0aend if;x0dx0ax0dx0aloopx0dx0afetch mycur into person1;x0dx0aexit when mycur%notfound;x0dx0adbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc);x0dx0aend loop;x0dx0aclose mycur;x0dx0aend;x0dx0ax0dx0a典型游标for 循环x0dx0ax0dx0a游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行x0dx0a数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取x0dx0a游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)x0dx0ax0dx0a使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。x0dx0ax0dx0aset serveroutput on; mycur(vartype number)isx0dx0aselect emp_no,emp_zc from cus_emp_basic x0dx0awhere com_no=vartype; person in mycur(000627) loopx0dx0ax0dx0adbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);x0dx0aend loop;x0dx0ax0dx0aend;
Ⅲ sql server中游标是什么意思能否用较为通俗的话解释一下谢谢!
游标其实就是一种刻度,打个比方你有100条数据,需要挨个把每条数据里面取出来消码察然后带入到另外的语句中去执行,模锋这就需要到游标了,拿茄游标一条条标记这一百条数据然后通过循环执行带入。
Ⅳ SQL 数据库中的游标指的是什么,有什么作用
游标:
作用:通常情况下,
关系数据库
中的操作总是对整个
记录
集产生影响,例如使用
SELECT语句
检索
数据表
时,将得到所有满足该
语句
where
子句
中
条件
的记录,而在实际应用
过程
中,经常需要
每次处理一条或者一部分记录。在这种情况下,需要使用游标在
服务器
内部
处理结果集合,他可
以有助于识别一个数据集合内部指定的记录,从而可以有选择的按记录执行操作。
Ⅳ Sql中的游标是干嘛的
游标(cursor)是结果集的逻辑扩展,可以看做指向结果集的一个指针,通过使用游标,应用程序可以逐行访问并处理结果集。
ResultSet对象用于接收查询结果,next()方法用于判断结果集是否为空,相当于指针,指向结果集下一个数据。
(5)怎样更好的理解sql里的游标扩展阅读:
游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
1、声明游标语法
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
2、打开游标语法
open [ Global ] cursor_name | cursor_variable_name
3、读取游标数据语法
Fetch[ [Next|prior|Frist|Last|Absoute n|Relative n ]from ][Global] cursor_name[into @variable_name[,....]]
4、关闭游标语法
close [ Global ] cursor_name | cursor_variable_name
5、释放游标语法
deallocate cursor_name
Ⅵ SQL中的指针和游标怎么理解
windows或DOS的“光标”不同,MS-SQL的游标是一种临时的数据库对象,既对可用来旋转储存在系统永久表中的数据行的副本,也可以指向储存在系统永久表中的数据行的指针。
游标为您提供了在逐行的基础上而不是一次处理整个结果集为基础的操作表中数据的方法。 1.如何使用游标 1)定义游标语句 Declare <游标名> Cursor For
2)创建游标语句 Open <游标名>
3)提取游标列值、移动记录指针 Fetch <列名列表> From <游标名> [Into <变量列表>]
4)使用@@Fetch_Status利用While循环处理游标中的行
5)删除游标并释放语句 Close <游标名>/Deallocate <游标名>
6)游标应用实例 --定义游标
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
--创建游标
Open cur_Depart
--移动或提取列值
Fetch From cur_Depart into @DeptID,@DeptName
--利用循环处理游标中的列值
While @@Fetch_Status=0
Begin
Print @DeptID,@DeptName
Fetch From cur_Depart into @DeptID,@DeptName
End
--关闭/释放游标
Close cur_Depart
Deallocate cur_Depart2.语句的详细及注意 1)定义游标语句 Declare <游标名> [Insensitive] [Scroll] Cursor
For <Select 语句> [FOR {Read Only | Update [ OF <列名列表>]}] Insensitive DBMS创建查询结果集数据的临时副本(而不是使用直接引用数据库表中的真实数据行中的列)。游标是Read Only,也就是说不能修改其内容或底层表的内容; Scroll 指定游标支持通过使用任意Fetch 选项(First Last Prior Next Relative Absolute)选取它的任意行作为当前行。如果此项省略,则游标将只支持向下移动单行(即只支持游标的Fetch Next); Select语句 定义游标结果集的标准 SELECT 语句。在游标声明的 <Select语句>内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO; Read Only 防止使用游标的用户通过更新数据或删除行改变游标的内容; Update 创建可更新游标且列出值能被更新的游标列。如果子句中列入了任意列,则只有被列入的列才能被更新。如果Declare Cursor语句中只指定的UPDATE(没有列名列表),则游标将允许更新它的任何或所有列。
Declare cur_Depart Cursor
For Select * From Department For Update OF cDeptID,cDeptName 2)提取游标列值、移动记录指针语句 Fetch [Next | Prior | First | Last | {Absolute <行号>} | {Relative <行号>}]
From <游标名> [Into <变量列表……>] 每次执行Fetch语句时,DBMS移到游标中的下一行并把游标中的列值获取到Into中列出的变量中。因此Fetch语句的Into子句中列出的变量必须与游标定义中Select 语句中的列表的类型与个数相对应; 仅当定义游标时使用Scroll参数时,才能使用Fetch语句的行定位参数(First Last Prior Next Relative Absolute);如果Fetch语句中不包括参数Next | Prior | First | Last,DBMS将执行默认的Fetch Next; Next 向下、向后移动一行(记录); Prior 向上、向前移动一行(记录); First 移动至结果集的第一行(记录); Last 移动至结果集的最后一行(记录); Absolute n 移动到结果集中的第n行。如果n是正值,DBMS从结果集的首部向后或向下移动至第n行;如果n是负数,则DBMS从结果集的底部向前或向上移动n行;
Fetch Absolute 2 From cur_Depart Into @DeptID,@DeptName Relative n 从指针的当前位置移动n行。如果n是正值,DBMS将行指针向后或向下移动至第n行;如果n是负数,则DBMS将行指针向前或向上移动n行;
Fetch Relative 2 From cur_Depart Into @DeptID,@DeptName 3)基于游标的定位DELETE/UPDATE语句 如果游标是可更新的(也就是说,在定义游标语句中不包括Read Only 参数),就可以用游标从游标数据的源表中DELETE/UPDATE行,即DELETE/UPDATE基于游标指针的当前位置的操作;
举例: --删除当前行的记录
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Delete From Department Where CURRENT OF cur_Depart --更新当前行的内容
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department into @DeptID,@DeptName
Open cur_Depart
Fetch From cur_Depart into @DeptID,@DeptName
Update Department Set cDeptID=’2007’ + @DeptID Where CURRENT OF cur_Depart3.游标使用技巧及注意 1)利用Order By改变游标中行的顺序。此处应该注意的是,只有在查询的中Select 子句中出现的列才能作为Order by子句列,这一点与普通的Select语句不同;
2)当语句中使用了Order By子句后,将不能用游标来执行定位DELETE/UPDATE语句;如何解决这个问题,首先在原表上创建索引,在创建游标时指定使用此索引来实现;例如:
Declare cur_Depart Cursor
For Select cDeptID,cDeptName From Department With INDEX(idx_ID)
For Update Of cDeptID,cDeptName
通过在From子句中增加With Index来实现利用索引对表的排序;
3)在游标中可以包含计算好的值作为列;
4)利用@@Cursor_Rows确定游标中的行数;