REF CURSOR游标

ref cursor(参考游标,游标变量)
1.游标三种类型:
显式游标,隐式游标,参考游标(变量游标)
通用属性:
显式游标,参考游标    隐式游标
CURSOR_NAME%FOUND SQL%FOUND
CURSOR_NAME%NOTFOUND    SQL%NOTFOUND
CURSOR_NAME%ISOPEN      SQL%ISOPEN
CURSOR_NAME%ROWCOUNT    SQL%ROWCOUNT
2.区别
oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区.
游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.


显式游标(隐式游标)格式:
    cursor cur_name [input_p,input_p2] [return ret_type]
    is select_sentence;
        #cur_name :定义游标名称
        #input_p:输入参数【可选】,多个参数可用逗号区分。
            参数格式:para_name [in] datatype[{:=|default}para_value]
                #para_name:参数名称
                #datatype:数据类型(不能指定具体长度,eg,不能varchar2(20),只能varchar2)
                #:=或default:默认赋值符合
                #para_value:默认赋值
    eg:cursor cur_emp(var_job in varchar2:='SALESMAN')
        is select * from emp where job=:var_job;
参数游标
    第一种格式:
        type type_cur_emp is ref cursor return  emp%rowtype;
        cur_emp type_cur_emp;
    第二种格式:
        type typ_result is record(ename emp.ename%type,sal emp.sal%type);
        type typ_cur_strong is ref cursor return typ_result;
        cur_emp typ_cur_strong;
        (类同第一种方式)
    第三种格式:
        type typ_cur_weak is ref cursor;
        cur_emp typ_cur_weak;
    第四种格式:
        cur_emp SYS_REFCURSOR;
3.举例:
    #####OPEN  FOR  不同表
            DECLARE 
                    TYPE typ_cur IS REF CURSOR;
                    cur_type typ_cur;
                    var_emp emp%ROWTYPE;
                    var_dept dept%ROWTYPE;
            BEGIN

      ###两次连续open 后一次会覆盖前一次#######
                OPEN  cur_type FOR SELECT * FROM emp;
                 OPEN cur_type FOR SELECT * FROM dept;

                    FETCH cur_type INTO var_emp;
                    FETCH cur_type INTO var_dept;
                /*
                    dbms_output.put_line(var_emp.job);----&gt此处放前会报错。
                    dbms_output.put_line(var_dept.loc);
                */
                dbms_output.put_line(var_dept.loc);
                dbms_output.put_line(var_emp.job);----&gt结果为空
            CLOSE cur_type;
        END;
        /
OPEN FOR 相同表
      #cur_type,cur_type2指向共同的结果集,后一次的fetch 会覆盖前一次fetch的值。
        DECLARE 
            TYPE typ_cur IS REF CURSOR;
                cur_type typ_cur;
                cur_type2 typ_cur;
                var_emp emp%ROWTYPE;

        BEGIN
              OPEN  cur_type FOR SELECT * FROM emp;
                cur_type2:=cur_type;
                FETCH cur_type INTO var_emp;
                FETCH cur_type2 INTO var_emp;

                dbms_output.put_line(var_emp.empno);
                dbms_output.put_line(var_emp.empno);

        CLOSE cur_type;
                FETCH cur_type2 into var_emp;
                    dbms_output.put_line(var_emp.empno);
        END;
#批量导入 bulk collect
            DECLARE 
                    TYPE typ_cur IS REF CURSOR;
                        cur_type typ_cur;
                    type em_list is table of emp.empno%type;
                    var_emp em_list;

            BEGIN
                  OPEN  cur_type FOR SELECT empno FROM emp;

                    FETCH cur_type  bulk collect INTO var_emp;
            CLOSE cur_type;
                    for i in var_emp.first..var_emp.last
                        loop
                            dbms_output.put_line(var_emp(i));
                        end loop;

               END;
    

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29665458/viewspace-1221185/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29665458/viewspace-1221185/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值