Oracle学习笔记第十二天-01

Oracle学习笔记第十二天-01

游标

概念: 游标是系统为用户开设的一个数据缓冲区,存放SQL 语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录

分类:

静态游标: 在编译时知道其SELECT 语句的游标

动态游标: 运行的时候动态决定执行何种查询

--语法
-- 声明游标
	CURSOR  cursor_name is   query_sql;
-- 打开游标
	OPEN cursor_name;
-- 提取游标
	FETCH cursor_name INTO variable_list;
-- 使用FETCH语句实现对游标内容的读取
-- variable_list必须与从游标提取的结果集类型相同
-- 关闭游标
	CLOSE cursor_name;
-- 使用CLOSE语句关闭一个游标
-- 关闭游标后,所有资源都将被释放

举例:先登录Scott用户

SET SERVEROUTPUT ON;
DECLARE
    -- 定义一个游标
    CURSOR c_emp IS SELECT * FROM emp;

    -- 定义一个变量来接收游标读取出来的值
    v_emp emp%ROWTYPE;

BEGIN
    -- 先打开游标
    OPEN c_emp;
    
    -- 提取游标
    FETCH c_emp INTO v_emp;
    
    dbms_output.put_line('工号:'||v_emp.empno||
                         '姓名:'||v_emp.ename||
                         '工资:'||v_emp.sal);
    CLOSE c_emp;
END;
/

这里只提取了一行,现在有个疑问就是怎么提取下一行,其实很简单,就是再次调用 提取游标 就可以提取下一行。

SET SERVEROUTPUT ON;
DECLARE
    -- 定义一个游标
    CURSOR c_emp IS SELECT * FROM emp;

    -- 定义一个变量来接收游标读取出来的值
    v_emp emp%ROWTYPE;

BEGIN
    -- 先打开游标(此时执行查询sql,得到结果集)
    OPEN c_emp;
    
    LOOP
         -- 提取一行数据
         FETCH c_emp INTO v_emp;
         -- 判断是否要退出循环。
         EXIT WHEN c_emp%NOTFOUND;
    
         dbms_output.put_line('工号:'||v_emp.empno||
                              '姓名:'||v_emp.ename||
                              '工资:'||v_emp.sal);
    END LOOP;                     
    CLOSE c_emp;

END;
/

游标提取

属性 作用
%found 用于检验游标是否成功,通常在FETCH语句后使用,当游标按照条件查询出一条记录时,返回true
%isopen 判断游标是否处于打开状态,试图打开一个已经打开或者已经关闭的游标,将会出现错误,打开为true
%notfound 与%found的作用相反,当按照条件无法查询到记录时,返回true
%rowcount 循环执行游标读取数据时,返回检索出的记录数据的行数 ,当前取出来数据的行数

循环游标

它是使用显式游标最简单的方式。

-- 语法一:
for  记录名 in (游标名) 
loop
end loop;
-- 语法二:
for  游标名 in (select 语句) 
loop
end loop;

举例:

set serveroutput on;
declare
    --定义游标(查询所有员工表的工号,姓名,工资)
    cursor c_emp is select * from emp;
begin
    for v_emp in c_emp loop
        --输出
        dbms_output.put_line('工号:'||v_emp.empno||
                             '姓名:'||v_emp.ename||
                             '工资:'||v_emp.sal); 
    end loop;
end;
/
set serveroutput on;
declare
begin
    for v_emp in (select empno,ename,sal from emp) loop
        --输出
        dbms_output.put_line('工号:'||v_emp.empno||
                             '姓名:'||v_emp.ename||
                             '工资:'||v_emp.sal);
    end loop;
end;
/

这两个循环游标是显示游标的简化版,在这些版本中,不用自己去定义变量来接收游标中的数据,不用自己手动打开游标,不用自己手动关闭游标。

在循环过程中会自动打开游标,循环完候会自动关闭游标。

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85222745
今日推荐