PL/SQL中的游标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQL中的游标相关的知识,希望对你有一定的参考价值。

游标 :是一个指向上下文的句柄( handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。
定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句 ,     其    一般形式为:
   CURSOR cursor_name IS  select_statement;
打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。
OPEN cursor_name;

提取游标:就是检索结果集合中的数据行,放入指定的输出变量中。
FETCH cursor_name INTO {variable_list | record_variable };

关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据

CLOSE cursor_name;

例如:DECLARE
     v_ename  emp.ename%TYPE;
       v_sal      emp.sal%TYPE;
       CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11;
BEGIN
OPEN c_cursor;
FETCH c_cursor INTO v_ename, v_sal;
WHILE c_cursor %FOUND LOOP
   DBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) );
   FETCH c_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE c_cursor;
END;
PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能。

FOR index_variable IN cursor_name[value[, value]…] LOOP
    -- 游标数据处理代码
END LOOP;
例如:DECLARE
       CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;
BEGIN
--隐含打开游标
   FOR v_sal IN c_sal LOOP
   --隐含执行一个FETCH语句
   DBMS_OUTPUT.PUT_LINE( to_char(v_sal.empno)||’---‘||v_sal.ename||’---‘||to_char(v_sal.sal)) ;
   --隐含监测c_sal%NOTFOUND
   END LOOP;
--隐含关闭游标
END;
游标变量也是一个指向多行查询结果集合中当前数据行的指针。但与游标不同的是,游标变量是动态的,而游标是静态的。
游标变量为一个指针,它属于参照类型,所以在声明游标变量类型之前必须先定义游标变量类型。在PL/SQL中,可以在块、子程序和包的声明区域内定义游标变量参照类型。
TYPE ref_type_name IS REF CURSOR [ RETURN return_type]
 打开游标变量时使用的是OPEN…FOR 语句。格式为:
OPEN {cursor_variable_name | :host_cursor_variable_name}
    FOR select_statement;

使用FETCH语句提取游标变量结果集合中的数据。格式为:
FETCH {cursor_variable_name | :host_cursor_variable_name}
    INTO {variable [, variable]…| record_variable};

CLOSE语句关闭游标变量,格式为:
CLOSE {cursor_variable_name | :host_cursor_variable_name

游标变量应用举例:

例:BEGIN
    IF selection=’D’ THEN
        OPEN refcur FOR SELECT deptno, dname FROM dept;
        DBMS_OUTPUT.PUT_LINE(‘Department data’);
    ELSIF selection=’E’ THEN
        OPEN refcur FOR SELECT empno, ename||’ is a ‘||job FROM emp;
        DBMS_OUTPUT.PUT_LINE(‘Employee data’);
    ELSE
        DBMS_OUTPUT.PUT_LINE(‘Please enter ‘‘D’’ or ‘‘E’’ ’);
        RETURN;
    END IF;
    DBMS_OUTPUT.PUT_LINE(‘----------------------‘);
    FETCH refcur INTO sample;
    WHILE refcur%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(sample.id||’: ‘||sample.description);
        FETCH refcur INTO sample;
    END LOOP;
    CLOSE refcur;
    END;


 






























































以上是关于PL/SQL中的游标的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL中的游标

过程(PL/SQL 包)中的“ORA-01001 无效游标”

PL SQL 中的游标

可选参数作为游标中的条件 (PL/SQL)

oracle PL/SQL 中的游标

PL/SQL - 你可以通过索引访问游标中的某些记录吗?