Oracle Ref CURSOR使用小结

我之前在博客中总结了PL/SQL中游标(cursor)的使用方法,那篇文章中涉及到的是比较常用的游标知识,感兴趣的朋友可以先阅读下博客中《oracle pl/sql游标(cursor)使用小结》这篇文章,对游标有个大概的了解以后,再来阅读本文。下面,开始对oracle ref cursor的使用进行总结。

1、什么是REF CURSOR及其作用

阅读了《oracle pl/sql游标(cursor)使用小结》这篇文章以后,可以知道游标主要就是可以获取一个查询结果集,然后可以对这个结果集的记录进行一系列的操作。而直接使用cursor定义取出来的结果集可以看成是静态的,无法在程序间传递调用,那么REF CURSOR就是解决了程序间传递结果集的问题,可以理解成REF CURSOR动态关联了结果集。

2、静态CURSOR和REF CURSOR的区别

了解了上面的第一点以后,可以知道静态CURSOR和REF CURSOR存在如下几点的不同:

(1)静态CURSOR是静态定义出来的,其定义方法可以参见《oracle pl/sql游标(cursor)使用小结》,而REF CURSOR是动态关联的,在本文的后面会提到。

(2)使用REF CURSOR需要先定义REF CURSOR类型,再声明一个REF CURSOR变量。

(3)REF CURSOR可以作为参数进行传递,而静态游标是不可以的。

3、REF CURSOR的两种类型

REF CURSOR主要分为强REF CURSOR和弱REF CURSOR,对于强REF CURSOR在定义类型的时候要指定return type,CURSOR变量的类型必须和return type一致;对于弱REF CURSOR,在定义类型的时候不用指定return type,能和任何类型的CURSOR变量匹配,使用的时候更加灵活。强REF CURSOR和弱REF CURSOR的例子,我会在文章的后面总结到。

4、REF CURSOR的使用

怎么使用REF CURSOR我就不单独总结了,直接在代码中注明,由于REF CURSOR有两种类型,所以下面也分两种进行总结:

先假设有一张t_stores表,表中有学生姓名(name)、学生成绩(store)两个字段,下面在这个基础上举例:

(1)强REF CURSOR

DECLARE
  --定义ref cursor类型
  TYPE refcur01 IS REF CURSOR RETURN t_scores%ROWTYPE;
  TYPE refcur02 IS REF CURSOR RETURN t_scores.ename%TYPE;
  -- 声明ref cursor变量
  v_refcur01 refcur01;
  v_refcur02 refcur02;
  v_temp v_refcur02.name%TYPE;
BEGIN
  -- 打开ref cursor变量
  -- 获取成绩大于60分的学生的全部信息
  OPEN v_refcur01 FOR
    SELECT *
      FROM t_scores ts
     WHERE ts.score > 60;
  -- 获取成绩大于60分的学生的姓名
  OPEN v_refcur02 FOR
    SELECT ts.name
      FROM t_scores ts
     WHERE ts.score > 60;
  -- 使用for循环的方法输出学生的姓名和成绩
  FOR rec_01 IN v_refcur01
  LOOP
    dbms_output.put_line(rec_01.name || '的成绩是:' || rec_01.score);
  END LOOP;
  -- 使用fetch的方法输出学生的姓名
  LOOP
    FETCH v_refcur02
      INTO v_temp;
    EXIT WHEN v_refcur02%NOTFOUND;
    dbms_output.put_line(v_temp);
  END LOOP;
  -- 关闭v_refcur02
  CLOSE v_refcur02;
END;

(1)弱REF CURSOR

DECLARE
  -- 定义ref cursor类型
  TYPE refcur03 IS REF CURSOR;
  -- 声明ref cursor变量
  v_refcur03 refcur03;
  v_temp v_refcur03%ROWTYPE;
BEGIN
  -- 打开ref cursor变量
  -- 获取成绩大于60分的学生的全部信息
  OPEN v_refcur03 FOR
    SELECT *
      FROM t_scores ts
     WHERE ts.score > 60;
  LOOP
    FETCH v_refcur03
      INTO v_temp;
    EXIT WHEN v_refcur03%NOTFOUND;
    dbms_output.put_line(v_temp.name || '的成绩是:' || v_temp.score);
  END LOOP;
  -- 关闭v_refcur03
  CLOSE v_refcur03;
  -- 再次打开v_refcur03获取成绩大于60分的学生的姓名
  OPEN v_refcur03 FOR
    SELECT ts.name
      FROM t_scores ts
     WHERE ts.score > 60;
  LOOP
    FETCH v_refcur03
      INTO v_temp;
    EXIT WHEN v_refcur03%NOTFOUND;
    dbms_output.put_line(v_temp.name);
  END LOOP;
  -- 关闭v_refcur03
  CLOSE v_refcur03;
END;

通过上面的这两个例子可以发现,强类型和弱类型的区别就在于是否指定了return type,弱类型由于没有指定return type,所以在使用的时候很灵活。上面的这两段代码我电脑上没建这个表,也就没跑了,应该是没有什么问题的,如果有问题的话,可以在文章下面留言,我会修改的。

本文标题:Oracle Ref CURSOR使用小结

本文链接:http://yedward.net/?id=157

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章