ITPub博客

首页 > 数据库 > Oracle > REF CURSOR游标

REF CURSOR游标

原创 Oracle 作者:Eurca 时间:2014-07-17 15:23:51 0 删除 编辑
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);---->此处放前会报错。
                    dbms_output.put_line(var_dept.loc);
                */
                dbms_output.put_line(var_dept.loc);
                dbms_output.put_line(var_emp.job);---->结果为空
            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博客 ” ,链接:https://blog.itpub.net/29665458/viewspace-1221185/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-05-19

  • 博文量
    22
  • 访问量
    53231