PLSQL基础——游标

游标

  • 游标一次只能巡检一行数据
  • 游标巡检的结果暂时存在游标中,但它一次只能读取一行数据,所以可以赋给与结果集同结构的变量
  • 游标后面括号里面的数据类型不能指定长度
  • 当游标后面声明变量后,可以在下面打开游标的时候对这个变量赋值
  • 因为游标后面声明的变量是形参,所以如果下面赋值,以打开游标时的赋值为准
DECLARE
  CURSOR CUR_A (a number:=100)IS SELECT * FROM EMP WHERE DEPTNO = 10;--声明游标
  V_A EMP%ROWTYPE;--声明变量
BEGIN
  OPEN CUR_A(20);--打开游标
  --y
    LOOP
      FETCH CUR_A INTO V_A;--读取游标
      EXIT WHEN CUR_A%NOTFOUND;--判断循环
      DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB);
    END LOOP;
  CLOSE CUR_A;--关闭游标
END;

游标分类

  • 静态游标

    • 显示游标
    • 隐式游标sql
  • 动态游标

游标属性

一般用于控制程序流程

  • %FOUND:判断是否从结果集中提取了数据。当游标中有可以提取的数据时返回True,没有的时候返回False。
  • %ISOPEN:判断对应的游标变量是否打开,如果游标变量打开,则返回True;否则返回False。
  • %NOTFOUND:当没有从游标中提取到数据时,返回True,否则返回False。
  • %ROWCOUNT:用于返回到目前为止从游标中提取到的记录的行数。初始值是0,每提取一条数据%ROWCOUNT值会加1
EXIT WHEN CUR_A%NOTFOUND;
--判断当前行是否有数据 ,有则条件不成立,没有条件成立

显式游标使用过程

声明游标

关键字:CURSOR

declare
v_empno number:=&员工编号
cursor cu_name is select * from emp where empno=v_empno;--is后面跟着结果集
v_cu emp%rowtype--变量类型和数量与结果集的字段属性和数量y
--声明的时候结果集中出现的变量声明必须在游标之前

declare
cursor cu_name (v_empno number)is select * from emp where empno=v_empno;
--游标后面括号里面的数据类型不能指定长度
v_cu emp%rowtype
open cu_name(1001)--打开的时候可以给参数,运行的时候以给的参数为准

--实例:在一个begin中可以打开两次游标,使用不同的参数
DECLARE
  CURSOR CUR_A (V_DEPTNO NUMBER)
  IS SELECT * FROM EMP WHERE DEPTNO = V_DEPTNO;
 
  V_A  EMP%ROWTYPE;
BEGIN
  OPEN CUR_A(10);--使用参数等于10打开游标
    LOOP
      FETCH CUR_A INTO V_A;
      EXIT WHEN CUR_A%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
    END LOOP;
  CLOSE CUR_A ;
    
  OPEN CUR_A(30);--使用30再次打开游标
    LOOP
      FETCH CUR_A INTO V_A;
      EXIT WHEN CUR_A%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
    END LOOP;
  CLOSE CUR_A ;
END;

变量类型与结果集的结构类型一致

打开游标

OPEN CUR_A;   
OPEN CUR_A(30);--声明时带有参数

打开游标的时候,游标指向第一行上面,直到遇到fetch向下走一行,才指向第一行

读取游标

关键字:fetch into

读取游标一般与循环搭配

FETCH cu_name INTO V_cu;
--往下走一行,取这一行的数据,赋给变量
--若取数的时候当前行没有数据,则不会进行取数,此时存储的仍然是上一行的数据,赋值时则把上一行的数据赋给变量
--v_cu 与cu_name的结构要求一致
 LOOP
      FETCH CUR_A INTO V_A;
      EXIT WHEN CUR_A%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(V_A.EMPNO||V_A.ENAME||V_A.JOB||V_A.SAL);
    END LOOP;

for循环读取游标不需要fetch

显式游标for循环
declare
cursor cur_a is select * from emp--声明游标
begin 
for i in cur_a
loop
end loop;
end;

--隐式游标for循环

begin 
for i in (select * from emp)
loop
end loop;
end

关闭游标

关键字close

 CLOSE Cu_name;

隐式游标

关键字:sql

可以通过隐式游标的属性来了解操作的状态和结果,

进而控制程序的流程。

delete from emp where sal<3000;
--sql%rowcount
dbms_output.put_line(sql%rowcount)--返回上一条语句执行了多少次删除

动态游标

关键字:REF CURSOR

​ open 游标名 for 结果集

在一个语句块中,一个游标可以检索不同的结果集

在打开时面向结果集

声明

关键字:REF CURSOR

type <游标属性名> is REF CURSOR;
<游标名> <游标属性名>;
--实例:
type ref_v is ref cursor;
cur_a ref_v;

打开

关键字: open 游标名 for 结果集(结果集可以是字符串格式)

open cur_a for select * from emp;

完整过程

declare 
type ref_a is ref cursor;
cur_a ref_a;
v_a varchar(20):='&输入条件';--注意输入条件
v_emp emp%rowtype;
v_sql varchar(100):='select * from emp where '||v_a;
begin
   open cur_a for v_sql;--结果集可以是字符串格式查询语句变量
   loop
     fetch cur_a into v_emp;
     
     exit when cur_a%notfound;
     dbms_output.put_line(v_emp.ename);
     end loop;
     end;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值