Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT)

Oracle 遍历游标的四种方式汇总

在Oracle数据库中,常常需要使用游标来处理查询结果集。通过遍历游标可以获取到查询结果集中的所有数据。在Oracle数据库中,遍历游标的方式有多种,其中常用的方式有 for、fetch、while、BULK COLLECT。

1. for 方式

使用 for 遍历游标时,Oracle自动取出游标中的一行数据并赋给目标变量,然后在循环体中处理汇总。格式如下:

FOR 目标变量 IN 游标名称 LOOP
     -- 处理游标查询结果中的数据 
END LOOP;

示例:

定义一个游标,查询员工表中所有员工的姓名和部门名称,并计算部门员工个数。

DECLARE 
     -- 定义变量
    v_emp_name   emp.ename%TYPE;
    v_dept_name  dept.dname%TYPE;
    v_count      NUMBER := 0; -- 员工人数统计
BEGIN 
     -- 定义游标
    FOR emp_cursor IN (SELECT ename, dname FROM emp, dept WHERE emp.deptno = dept.deptno)
    LOOP 
         -- 取出游标中的查询结果并赋值,然后处理
        v_emp_name := emp_cursor.ename;
        v_dept_name := emp_cursor.dname;
        v_count := v_count + 1;
        DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp_name || ',部门名称:' || v_dept_name);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('员工总数为:' || v_count);
END;

2. fetch 方式

使用 fetch 遍历游标需要先打开游标,然后使用 loop 循环获取游标中的数据,并在每一次循环结束后判断游标是否已经读取了所有的数据。格式如下:

-- 打开游标
OPEN 游标名称;
LOOP 
     -- 取出游标中的查询结果并赋值,然后处理
    FETCH 游标名称 INTO 目标变量;

    -- 处理游标查询结果中的数据 
    EXIT WHEN 游标名称%NOTFOUND;
END LOOP;

-- 关闭游标
CLOSE 游标名称;

示例:

使用 fetch 方式遍历游标,查询员工表中所有员工的姓名和部门名称,并计算部门员工个数。

DECLARE 
    -- 定义变量
    v_emp_name   emp.ename%TYPE;
    v_dept_name  dept.dname%TYPE;
    v_count      NUMBER := 0; 
    -- 定义游标
    CURSOR emp_cursor IS
        SELECT ename, dname FROM emp, dept WHERE emp.deptno = dept.deptno;
BEGIN
    -- 打开游标
    OPEN emp_cursor;
    LOOP 
        -- 取出游标中的查询结果并赋值,然后处理
        FETCH emp_cursor INTO v_emp_name, v_dept_name;
        -- 处理游标查询结果中的数据 
        EXIT WHEN emp_cursor%NOTFOUND;
        v_count := v_count + 1;
        DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp_name || ',部门名称:' || v_dept_name);
    END LOOP;
    -- 关闭游标
    CLOSE emp_cursor;
    DBMS_OUTPUT.PUT_LINE('员工总数为:' || v_count);
END;

3. while 方式

使用 while 循环遍历游标时需要先打开游标,并在 while 循环中获取游标中的数据,如果游标已经读取完所有数据则退出循环,然后关闭游标。格式如下:

-- 打开游标
OPEN 游标名称;
WHILE 游标名称%FOUND LOOP 
     -- 取出游标中的查询结果并赋值,然后处理
    FETCH 游标名称 INTO 目标变量;

    -- 处理游标查询结果中的数据 
END LOOP;
-- 关闭游标
CLOSE 游标名称;

示例:

使用 while 方式遍历游标,查询员工表中所有员工的姓名和部门名称,并计算部门员工个数。

DECLARE 
    -- 定义变量
    v_emp_name   emp.ename%TYPE;
    v_dept_name  dept.dname%TYPE;
    v_count      NUMBER := 0; 
    -- 定义游标
    CURSOR emp_cursor IS
        SELECT ename, dname FROM emp, dept WHERE emp.deptno = dept.deptno;
BEGIN
    -- 打开游标
    OPEN emp_cursor;
    WHILE emp_cursor%FOUND LOOP 
        -- 取出游标中的查询结果并赋值,然后处理
        FETCH emp_cursor INTO v_emp_name, v_dept_name;
        -- 处理游标查询结果中的数据 
        v_count := v_count + 1;
        DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp_name || ',部门名称:' || v_dept_name);
    END LOOP;
    -- 关闭游标
    CLOSE emp_cursor;
    DBMS_OUTPUT.PUT_LINE('员工总数为:' || v_count);
END;

4. BULK COLLECT 方式

使用 BULK COLLECT 遍历游标时,Oracle会同时取出游标中的多条数据,然后赋给 PL/SQL 表,从而提高了查询数据的效率。格式如下:

-- 定义 PL/SQL 表
TYPE 目标变量列表 IS TABLE OF 表列类型;

-- 取出游标中的多条数据赋给 PL/SQL 表
BULK COLLECT INTO 目标变量列表 FROM 游标名称;

-- 处理 PL/SQL 表中的所有数据 
FOR i IN 目标变量列表.First..目标变量列表.Last LOOP
     -- 处理 PL/SQL 表中的数据 
     目标变量 := 目标变量列表(i);
END LOOP;

示例:

使用 BULK COLLECT 遍历游标,查询员工表中所有员工的姓名和部门名称,并将这些信息存入 PL/SQL 表中。

DECLARE 
     -- 定义 PL/SQL 表
    TYPE emp_dept_tbl IS TABLE OF emp.ename%TYPE;
    TYPE dept_tbl IS TABLE OF dept.dname%TYPE;

    -- 声明变量
    v_emp_names   emp_dept_tbl;
    v_dept_names  dept_tbl;

BEGIN 
     -- 定义游标并使用 BULK COLLECT 将游标中的数据取出到 PL/SQL 表中 
    CURSOR emp_cursor IS
        SELECT ename, dname FROM emp, dept WHERE emp.deptno = dept.deptno;
    BEGIN
        BULK COLLECT INTO v_emp_names, v_dept_names FROM emp_cursor;

        -- 遍历 PL/SQL 表中的数据
        FOR i IN v_emp_names.First..v_dept_names.Last LOOP
            DBMS_OUTPUT.PUT_LINE('姓名:' || v_emp_names(i) || ',部门名称:' || v_dept_names(i));
        END LOOP;
    END;
END;

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT) - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • oracle 如何关闭打开归档日志

    在Oracle数据库中,可以通过SQL语句或者RMAN命令来关闭或打开归档日志。以下是详细讲解Oracle如何关闭打开归档日志的完整攻略,包含两个例。 关闭归档日志 在Oracle数据库中,可以使用SQL语句关闭归档日志。以下是一个示例: SQL> ALTER DATABASE NOARCHIVELOG; 在上面的示例中,我们使用ALTER DATAB…

    Oracle 2023年5月15日
    00
  • Oracle中的触发器trigger

    来详细讲解一下“Oracle中的触发器trigger”的完整攻略。触发器trigger是一种数据库对象,可以在数据库执行特定的操作时触发。由于它们与数据库操作紧密相关,因此可以认为它们是一种“反应式编程”的形式。以下是Oracle中触发器的相关细节。 触发器trigger的创建和删除 创建触发器trigger 在Oracle中,可以使用以下语法来创建触发器t…

    Oracle 2023年5月16日
    00
  • Oracle表的分类以及相关参数的详解

    Oracle表的分类以及相关参数的详解 在Oracle数据库中,表是关系数据库的核心数据存储结构。在Oracle中,表可以根据不同的方式进行分类,每种分类方式都包含了不同的相关参数。下面我们来详细讲解一下Oracle表的分类以及相关参数的详解。 Oracle表分类 在Oracle中,表可以根据不同的分类方式分为以下几类: 1. 堆表(Heap-organiz…

    Oracle 2023年5月16日
    00
  • oracle错误代码大全(超详细)

    下面是详细讲解“oracle错误代码大全(超详细)”的完整攻略,该攻略包含以下几个部分: 攻略介绍 oracle错误代码分类 错误代码示例说明 总结 1. 攻略介绍 “oracle错误代码大全(超详细)”是一篇总结了常见oracle错误代码及其解决方法的文章。作者将错误代码分为了十几个大类,并详细讲解了每个类别下的常见错误码和解决方法。该攻略可以对oracl…

    Oracle 2023年5月16日
    00
  • 简析Oracle数据库常见问题及解决方案

    简析Oracle数据库常见问题及解决方案 概述 Oracle数据库是企业级数据库中最具影响力的数据库系统之一,常用于大型企业和政府机构。本文将简单分析Oracle数据库的常见问题及解决方案,以帮助用户更好的理解和应对这些问题。 Oracle数据库常见问题及解决方案 1. 数据库无法启动 问题描述 在启动Oracle数据库时,可能会遇到无法启动的情况,主要表现…

    Oracle 2023年5月16日
    00
  • Oracle的CLOB大数据字段类型操作方法

    下面我为你详细讲解“Oracle的CLOB大数据字段类型操作方法”的完整攻略,包括两个示例: 什么是CLOB? CLOB是Oracle数据库中的一种大数据字段类型,可以存储大量的字符数据。CLOB字段可以存储长文本,如博客文章、新闻稿等等。在Oracle中,CLOB字段的最大长度是4GB(2的32次方-1)。 如何创建CLOB字段? 可以使用如下的SQL语句…

    Oracle 2023年5月16日
    00
  • Oracle数据库的字段约束创建和维护示例

    下面我将详细讲解一下“Oracle数据库的字段约束创建和维护示例”的完整攻略,过程中包括两条示例说明。 创建字段约束 在Oracle数据库中,可以通过创建字段约束来保证数据的完整性和一致性。下面是创建字段约束的步骤: 步骤一:选择要约束的字段 首先需要选择要约束的字段,可以在创建表的时候就同时定义字段的约束,或者在已有的表中添加新的约束。 步骤二:定义约束规…

    Oracle 2023年5月16日
    00
  • Oracle 12c安装方法及一些使用问题

    下面是“Oracle 12c安装方法及一些使用问题”的完整攻略。 安装准备 首先,需要准备好以下软件: Oracle Database 12c(12.1.0.1.0)或更高版本的安装文件 Oracle Database 12c后续更新的安装文件(如更新到12.1.0.2.0) Oracle Database 12c的补丁文件(如果需要) 此外,还需要满足以下…

    Oracle 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部