游标sql
- SQL语言是面向集合的,是对指定列的操做。若是要对列中的指定行进行操做,就必须使用游标。
- 当在PL/SQL块中执行查询语句(SELECT) 和数据操纵语句(DML) 时,Oracle会为其分配一个上下文区(Context Area)
- 游标是指向上下文区的指针,它为应用提供了一种对具备多行数据查询结果集中的每一行数据分别进行单独处理的方法
显式游标oracle
游标分为显式游标和隐含游标两种oop
- 隐含游标用于处理SELECT INTO和DML语句
- 显式游标则用于处理S ELECT语句返回的多行数据
- 使用显式游标
定义游标fetch
CURSOR cursor_ name IS select statement;spa
打开游标指针
OPEN cursor name;code
提取数据blog
FETCH cursor_name INTO variable1,variable...;it
FETCH cursor_name bulk collect into collect1..;for循环
关闭游标
CLOSE cursor name;
代码:
--建立游标 declare cursor 游标名称 is select * from 表名; 变量名 表名%rowtype; begin open 游标名;--打开游标 loop fetch 游标名 into 变量名;--提取游标 exit when 游标名%notfound; dbms_output.put_line(变量名.列名); end loop; close 游标名;--关闭游标 end;
显示游标属性
显式游标属性用于返回显式游标的执行信息
- 游标属性使用格式为: 游标名+ 属性名
- %ISOPEN
用于肯定游标是否已经打开。若是游标已经打开,则返回值为TRUE; 不然返回FALSE
- %FOUND
检查是否从结果集中提取到数据。若是提取到数据,则返回值为TRUE; 不然返回FALSE
- %NOTFOUND
与%FOUND属性刚好相反,若是提取到数据,则返回值为FALSE; 不然返回TRUE
- %ROWCOUNT
返回到当前行为止已经提取到的实际行数
参数游标
参数游标是指带有参数的游标。在定义了参数游标以后,使用不一样参数值屡次打开游标能够生成不一样的结果集。
代码:
--参数游标 declare cursor cursor_wxn(x_empno number)--定义参数(形参) is select * from emp where empno=x_empno; v_name emp%rowtype; begin open cursor_wxn(7369);--(实参) loop fetch cursor_wxn into v_name; exit when cursor_wxn%notfound; dbms_output.put_line(v_name.ename); end loop; close cursor_wxn; end;
游标for循环
游标for循环是在pl/sql块中使用游标的最简单方式,它能够简化对游标的处理。当使用游标for循环时,oracle会隐含的打开游标,提取游标数据并关闭游标。
代码:
--游标for循环 declare v_name emp%rowtype; cursor cursor_wxn is select * from emp; begin for v_name in cursor_wxn loop dbms_output.put_line(v_name.ename); end loop; end;
上面代码中无须进行取值和关闭的操做,游标for循环能够本身进行。
下面还有一个更为简单的游标for循环,参考上面的代码进行读阅:
--简单for begin for v_name in (select * from emp) loop dbms_output.put_line(v_name.ename); end loop; end;
使用游标变量
代码实例:
declare type youbiao_bianliang is ref cursor;--变量类型 cursor_varisble youbiao_bianliang;--定义游标类型的变量 v_name emp%rowtype;--变量 begin open cursor_varisble for select * from emp where empno=7788; loop fetch cursor_varisble into v_name; exit when cursor_varisble%notfound; dbms_output.put_line(v_name.ename); end loop; close cursor_varisble; end;
隐含游标
做用:用属性进行一些判断(一种判断方式)
含义:当执行一条DML语句或者SELECT...INTO语句时,都会建立一个隐含游标。
隐含游标的名称是SQL,不能对SQL游标显示执行OPEN、FETCH和CLOSE语句。
Oracle隐式地打开、提取,并老是自动地关闭SQL游标。
属性:
- SQL%FOUND:只有DML语句影响一行或多行时,SQL%FOUND属性才返回true。
- SQL%NOTDOUND:若是DNL语句没有影响行数,此属性将返回false。
- SQL%ROWCOUNT:返回DML影响的行数,若是DML语句没有影响行则返回0.
- SQL%ISOPEN:此属性用于判断SQL游标是否已经打开。在执行SQL语句以后,Oracle自动关闭SQL游标,因此隐含游标的SQL%ISOPEN属性始终为false。
简单示例1:
-- 隐含游标 begin delete from emp where empno=1; if sql%notfound then dbms_output.put_line('找不到记录'); else dbms_output.put_line('记录'); end if; end;
示例2:
declare a number:=1; begin delete from emp where empno=a; if sql%notfound then dbms_output.put_line('没有改变'); else dbms_output.put_line('改变'); end if; end;