Oracle pl/sql编程 15---游标变量

来源:转载

与游标类似,游标变量也可以处理多行查询的结果集。但是,游标与游标变量是不同的,就像常量和变量的关系一样。游标包括显式游标和隐式游标,它们都是静态定义的。当用户使用它们时,就需要再声明时定义查询。而游标变量是动态的,它不与特定的查询绑定在一起,而是运行时才确定所使用的查询。


游标变量的定义包括两个步骤:

(1)定义CURSOR类型的指针

   type ref_cursor_name is ref cursor[return teturntype];

  (2)定义ref cursor类型的变量

 

<span style="font-size:24px;">type emp_ref_cursor is ref cursor is ref cursor;v_emp_cursro emp_ref_cursor;</span>

这样定义的游标类型称为弱ref cursor类型,这是因为没有指定游标的返回类型,因此它能指向一个具有任意多列的select查询结果


强ref cursor类型要求用户声明构成所使用查询结果集的返回类型

<span style="font-size:24px;">type emp_ref_cursor2 is ref cursor return emp%rowtype;v_emp_cursro2 emp_ref_cursor2;</span>

游标变量的使用方法和游标相同都是要 声明--》打开--》检索--》关闭


<span style="font-size:24px;">declare --定义记录类型<span style="font-size:24px;"> type emp_record is record( emp_record_empno emp.empno%type, emp_record_ename emp.ename%type, emp_record_job emp.job%type, emp_record_mgr emp.mgr%type, emp_record_hiredate emp.hiredate%type, emp_record_sal emp.sal%type, emp_record_comm emp.comm%type, cursor_result_deptno emp.deptno%type ); --定义一个游标变量 type emp_ref_cursor3 is ref cursor return emp_record; v_emp_cursro3 emp_ref_cursor3; v_emp_record emp_record;begin open v_emp_cursro3 for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; LOOP fetch v_emp_cursro3 into v_emp_record; exit when v_emp_cursro3%notfound; dbms_output.put_line(v_emp_record.emp_record_empno); dbms_output.put_line(v_emp_record.emp_record_ename); dbms_output.put_line(v_emp_record.emp_record_job); dbms_output.put_line(v_emp_record.emp_record_mgr); dbms_output.put_line(v_emp_record.emp_record_hiredate); dbms_output.put_line(v_emp_record.emp_record_sal); dbms_output.put_line(v_emp_record.emp_record_comm); dbms_output.put_line(v_emp_record.cursor_result_deptno); dbms_output.put_line('========================================'); end loop; close v_emp_cursro3end;</span>


使用游标变量真正的好处是在必须使用同一游标变量打开多个查询时,或根据运行时的条件,需要动态地把不同的查询赋予相同的游标体现。使用同一游标变量打开多个查询 如下:

<span style="font-size:24px;">declaretype rc is ref cursor;v_rc rc;emp_recode emp%rowtype;begin--打开第一个查询open v_rc for select * from emp where deptno=10;dbms_output.put_line('第一条查询语句');loopfetch v_rc into emp_recode;exit when v_rc%notfound;dbms_output.put_line('员工'||emp_recode.ename||',工号是'||emp_recode.empno||',工作'||emp_recode.job||',工资'||emp_recode.sal||',部门号'||emp_recode.deptno);end loop;open v_rc for select * from emp where sal>2000;dbms_output.put_line('第二条查询语句');loopfetch v_rc into emp_recode;exit when v_rc%notfound;dbms_output.put_line('员工'||emp_recode.ename||',工号是'||emp_recode.empno||',工作'||emp_recode.job||',工资'||emp_recode.sal||',部门号'||emp_recode.deptno);end loop;close v_rc;end;</span>




分享给朋友:
您可能感兴趣的文章:
随机阅读: