plsql游标

本文详细介绍了PLSQL中游标的使用方法,包括显示游标、游标的属性、批量提取数据、定义记录变量、参数游标、更新和删除数据等操作,并展示了如何利用游标变量进行数据处理。

/**

  plsql游标

*/

 

/**

  显示游标

*/

declare

    cursor emp_cursor is select ename,sal from emp;

    v_name varchar2(40);

    v_sal  number;

begin

    open emp_cursor;

 

    loop

         fetch emp_cursor into v_name,v_sal;

         exit when emp_cursor%notfound;

         dbms_output.put_line(v_name || ':' ||v_sal); 

    end loop;

 

    close emp_cursor;

end;

 

/**

  显示游标的属性

*/

declare

    cursor emp_cursor is select ename,sal from emp;

    v_name varchar2(40);

    v_sal  number;

begin

 

    if emp_cursor%isopen then

       dbms_output.put_line('游标已经打开'); 

    else

       dbms_output.put_line('现在打开游标');

       open emp_cursor;

    end if;

 

    loop

         fetch emp_cursor into v_name,v_sal;

 

         if emp_cursor%notfound then

            dbms_output.put_line('没有找到数据退出');

            exit;

         end if;

 

         dbms_output.put_line(emp_cursor%rowcount || ':' || v_name || ':' ||v_sal); 

    end loop;

 

    close emp_cursor;

end;

 

/**

    使用bulk collect批量提取数据

*/

 

declare

    type emp_record_type is record(

         ename emp.ename%type,

         sal   emp.sal%type

    );

 

    type emp_table_type is table of emp_record_type;

 

    emp_table emp_table_type;

 

    cursor emp_cursor is select ename,sal from emp;

begin

    open emp_cursor;

 

    fetch emp_cursor bulk collect into emp_table;

 

    for i in 1.. emp_table.count loop

        dbms_output.put_line(emp_table(i).ename ||':'||emp_table(i).sal);

    end loop;

 

    close emp_cursor;

end;

 

/**

    基于游标定义记录变量

*/

declare

    cursor emp_cursor is select ename,sal from emp;

    emp_record emp_cursor%rowtype;

begin

    open emp_cursor;

 

    loop

         fetch emp_cursor into emp_record;

         exit when emp_cursor%notfound;

         dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);

    end loop;

 

    close emp_cursor;

end;

 

/**

    参数游标

*/

declare

    cursor emp_cursor(no varchar2) is select ename,sal from emp where empno=no;

    emp_record emp_cursor%rowtype;

begin

    open emp_cursor('7788');

 

    loop

         fetch emp_cursor into emp_record;

         exit when emp_cursor%notfound;

         dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);

    end loop;

 

    close emp_cursor;

end;

 

/**

    使用游标更新和删除数据

*/

declare

    cursor teacher_cursor is select name from teacher for update;

    v_name teacher.name%type;

begin

    open teacher_cursor;

 

    loop

         fetch teacher_cursor into v_name;

         exit when teacher_cursor%notfound;

         update teacher set name='newname' where current of teacher_cursor; 

    end loop;

 

    close  teacher_cursor;

end;

 

/**

    游标for循环

*/

declare

    cursor emp_cursor is select ename,sal from emp;

begin

    for emp_record in emp_cursor loop

        dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);

    end loop;

end; 

 

/**

    for循环中直接使用子查询

*/

begin

    for emp_record in (select ename,sal from emp) loop

        dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);

    end loop;

end;

 

/**

    游标变量

*/

declare

    type emp_cursor_type is ref cursor;

 

    emp_cursor emp_cursor_type;

    v_name varchar2(40);

    v_sal  number;

begin

    open emp_cursor for select ename,sal from emp;

 

    /*使用for循环报错

         for emp_record in emp_cursor loop

             dbms_output.put_line(emp_record.ename ||':'||emp_record.sal);

        end loop;

    */

 

    loop

          fetch emp_cursor into v_name,v_sal;

          exit when emp_cursor%notfound;

          dbms_output.put_line(v_name ||':'|| v_sal);

    end loop;

 

    close emp_cursor;

end;

 

/**

    带返回值的游标变量

*/

declare   

    type emp_record_type is record(

         ename varchar2(40),

         sal   number

    );

 

    type emp_cursor_type is ref cursor return emp_record_type;

 

    emp_cursor emp_cursor_type;

    emp_record emp_record_type;

 

begin

    open emp_cursor for select ename,sal from emp;--select语句返回值必须和emp_record_type一样

 

    loop

         fetch emp_cursor into emp_record;

         exit when emp_cursor%notfound;

         dbms_output.put_line(emp_record.ename ||':'|| emp_record.sal); 

 

    end loop;

 

    close emp_cursor;

end;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值