`

oracle cursor (游标)

阅读更多
--ref 游标
/*
    显示游标 多行
    隐含游标 数据操纵语言 DML 和单行select into语句
    
    1.定义游标 
        指定游标所对应的select结果集语句
        CURSOR cursor_name IS select_statement;
           select_statement:查询语句
    2.打开游标
        OPEN cursor_name;
         执行游标所对应的select_statement,将结果暂时存放在游标结果集中
    3.提取数据
         使用fetch语句提取游标数据,fetch每次只能提取一行;fetch..bulk collect into可以提取多行
         FETCH cursor_name into variable...;
             variable 接受游标数据的变量
         FETCH cursor_name BULK COLLECT INTO collection...;
             collection 接收游标数据的集合变量
    4.关闭游标
         提取完数据,关闭游标,释放结果集
         CLOSE cursor_name;
         
         
         
    *游标属性
      cursor_name%ISOPEN  游标是否已打开
      cursor_name%FOUND   FETCH语句执行后,用来判断是否有数据被提取
      cursor_name%NOTFOUND 同上
      cursor_name%ROWCOUNT 目前已经fetch的行数
     
*/
--隐含游标
DECLARE 
  v_name varchar2(30);
BEGIN
  select ename into v_name from emp where empno = 7788;
  CASE
  WHEN SQL%FOUND THEN
    dbms_output.put_line('隐身游标的行数肯定是:'||SQL%ROWCOUNT||',查询的结果:'||v_name);
    --隐身游标的行数肯定是:1,查询的结果:SCOTT
  END CASE;
END;

--显示游标

--fetch提取一行数据
DECLARE
   CURSOR emp_cs is select ename,job from emp;--声明游标
   v_name emp.ename%type;
   v_job  emp.job%type;
BEGIN
   OPEN emp_cs;
   LOOP--因为fetch只提取一条数据,所以用循环多次提取
        FETCH emp_cs INTO v_name,v_job;
        EXIT WHEN emp_cs%NOTFOUND;--当游标中没有数据时,退出循环
        dbms_output.put_line(emp_cs%ROWCOUNT||'--'||v_name||'--'||v_job);
   END LOOP;
   CLOSE emp_cs;
END;

--FETCH ...BULK COLLECTION 提取多行数据
DECLARE
   --声明存储多行数据的集合类型
   TYPE v_table_type IS TABLE OF VARCHAR2(30);
   name_table v_table_type;
   job_table v_table_type;
   CURSOR emp_cs IS select ename,job from emp;
BEGIN
   OPEN emp_cs;
   FETCH emp_cs BULK COLLECT INTO name_table,job_table; --两个嵌套表类型不需要初始化
   FOR i IN 1..name_table.count LOOP
       dbms_output.put_line(name_table(i)||'--'||job_table(i));
   END LOOP;
   CLOSE emp_cs;
END;

--分页提取,每次提取固定条数
DECLARE
   type v_table_type IS TABLE OF int;
   no_tab v_table_type;
   pageNo int :=5;--5条一页
   nums int:=0;--已经输出的条数
   CURSOR emp_cs IS select empno from emp;
BEGIN
   --OPEN emp_cs;
   IF NOT emp_cs%ISOPEN THEN
      OPEN emp_cs;
   END IF;
   LOOP--LIMIT语句限制每次提请的条数,从上次游标rowcount处开始
      FETCH emp_cs BULK COLLECT INTO no_tab LIMIT pageNo;
      --打印刚获取的数据(5条),右边界计算方法:游标总共fetch的条数-已经输出的条数
      FOR I IN 1..(emp_cs%ROWCOUNT - nums) LOOP
          dbms_output.put_line(no_tab(i));
      END LOOP;
      dbms_output.new_line;
      nums := emp_cs%ROWCOUNT;--从新设置已输出的条数
      /*
       --这一句放到最后,因为知道emp表中共有14条记录,可以分为3页,第3次Fecth只有4条数据,
       --这时候已经是NOTFOUND了,如果放到输出前面的话,后4条就不能被输出了
      */
      EXIT WHEN emp_cs%NOTFOUND; 
   END LOOP;
   CLOSE emp_cs;
END;


--游标 记录变量
DECLARE
   CURSOR emp_cs IS select ename,job from emp;
   v_record emp_cs%ROWTYPE;--游标行类型定义record
BEGIN
   OPEN emp_cs;
   LOOP
      FETCH emp_cs INTO v_record;
      EXIT WHEN emp_cs%NOTFOUND;
      dbms_output.put_line(v_record.ename||'--'||v_record.job);
   END LOOP;
   CLOSE emp_cs;
END;


--参数游标 就是差不多相当与函数了 根据不同的参数值有不同的游标数据
--参数一般会在游标的select语句中使用,否则也就没意义了
/*
   CURSOR cursor_name(parametr_name datatype...) IS select_statement;
   *参数只能定义类型,不能定义长度,
*/

DECLARE 
   CURSOR emp_cs(param1 varchar2) IS select ename from emp where job =param1;
   v_name emp.ename%type;
   v_job varchar2(30) := '&job';
BEGIN
   OPEN emp_cs(v_job);
   LOOP
       FETCH emp_cs INTO v_name;
       EXIT WHEN emp_cs%NOTFOUND;
       dbms_output.put_line(v_name);
   END LOOP;
   CLOSE emp_cs;
END;



--使用游标更新或删除数据
/*
   游标不仅可以查询数据,也可以修改数据,由于游标是操作的多条数据更新,为
   保证事物的原子性,我也不知道怎么称呼,反正就是防止游标中的数据行在修改的过程中
   有其它的事务修改这些列 要使用FOR UPDATE 子句
   如:游标中有5条数据,你这时正执行修改第3条数据,而这时另一个事务修改了第4条数据。
   而游标是临时缓存结果集,4的修改就不会被看到。这样就乱套了
   
   CURSOR cursor_name(param datatype) IS 
    select_statement FOR UPDATE [OF column_reference][NOWAIT];
    
    FOR UPDATE在游标结果集数据行上加行共享锁,防止其它用户在相应
    行上执行DML操作。
*/
DECLARE
    CURSOR emp_cs IS select comm from emp FOR UPDATE;
    v_comm number(7,2);
BEGIN
    OPEN emp_cs;
    LOOP
       FETCH emp_cs INTO v_comm;
       EXIT WHEN emp_cs%NOTFOUND;
       IF v_comm is null THEN
          UPDATE emp SET comm=1 WHERE CURRENT OF emp_cs;
       END IF;
    END LOOP;
    CLOSE emp_cs;
END;
commit;

/*
游标for循环
简化了对游标的处理,使用游标for循环时,oracle会隐含的打开游标、
提取数据并关闭游标
*/
--1
DECLARE
    CURSOR emp_cs IS select ename,job from emp;
BEGIN
    FOR emp_record IN emp_cs LOOP--emp_record是隐含定义的记录变量名
        dbms_output.put_line(emp_cs%ROWCOUNT||'-'||emp_record.ename);
    END LOOP;
END;

--2 在游标for循环中直接是哦那个select语句定义游标
--不过这样就不能使用游标属性了,因为没有游标名字
BEGIN
    FOR emp_record IN (select ename,job from emp) LOOP
        dbms_output.put_line(emp_record.ename);
    END LOOP;
END;


/*
    使用游标变量
    使用显示游标时,需要在定义部分指定所对应的静态select语句;
    当使用游标变量时,就可在打开游标变量时指定其所对应的select语句。
    定义游标变量
    TYPE ref_type IS REF CURSOR[RETURN return_type];
    cursor_var ref_type;
*/
--exp1
DECLARE
    TYPE emp_cursor_type IS REF CURSOR; --定义一个游标变量类型
    emp_cs emp_cursor_type;--使用这个游标类型定义一个游标变量
    emp_record emp%ROWTYPE;
BEGIN
    OPEN emp_cs FOR select * from emp;--打开游标变量时指定其所对应的select语句
    LOOP 
       FETCH emp_cs INTO emp_record;--取数据就和普通的游标一样了
       EXIT WHEN emp_cs%NOTFOUND;
       dbms_output.put_line(emp_record.ename);
    END LOOP;
    CLOSE emp_cs;
END;

--exp2 定义游标变量是指定返回类型(智能是record)
DECLARE
    TYPE v_record_type IS RECORD(
         name varchar2(10),sal number
    );
    TYPE v_cursor_type IS REF CURSOR RETURN v_record_type;--返回上面定义的record类型
    --声明一个record变量,一个cursor变量
    v_record v_record_type;
    v_cursor v_cursor_type;
BEGIN
    OPEN v_cursor FOR select ename,sal from emp where deptno=10;
    LOOP 
       FETCH v_cursor INTO v_record;
       EXIT WHEN v_cursor%NOTFOUND;
       dbms_output.put_line(v_record.name||'-'||v_record.sal);
    END LOOP;
    CLOSE v_cursor;
END;
2
4
分享到:
评论

相关推荐

    ORACLE技术文档\oracle cursor 游标.doc

    Oracle游标,或称为光标,是数据库管理系统中用于处理SQL查询的一种机制,它允许程序逐行处理查询结果。在Oracle中,游标是至关重要的,尤其在进行复杂的交互式数据操作时。当一个应用程序尝试打开过多的游标时,...

    快速掌握Oracle数据库游标的使用方法

    Oracle 数据库游标的使用方法 Oracle 数据库游标是指在查询返回结果超过一行时,需要使用的显式游标。用户不能使用 select into 语句,而是需要使用游标来处理多行查询结果。在 PL/SQL 中,隐式游标会在查询开始时...

    oracle 隐式游标,显示游标,游标循环

    ### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行...

    oracle数据库游标使用例子

    游标(Cursor)是一种机制,它允许我们遍历和操作由SQL查询返回的结果集。通过游标,我们可以控制数据的读取顺序,一次只处理一行,或者在处理完一行后移动到下一行。 2. **游标的属性**: - `%FOUND`:用于检查...

    oracle游标的总结oracle游标的总结

    Oracle 游标概述 Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、...

    oracle笔记游标的使用

    oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!

    Oracle的游标学习

    Oracle的游标是数据库开发中的一个重要概念,尤其在PL/SQL编程中,游标用于处理SQL查询结果集,使得我们能够逐行处理数据,而不仅仅局限于一次性获取所有数据。在这个主题中,我们将深入探讨游标的定义、类型、使用...

    ORACLE 游标使用示例

    在Oracle数据库中,游标(Cursor)是一种非常重要的编程工具,尤其在处理复杂的数据操作时。游标允许我们逐行处理查询结果,这对于迭代、条件判断或者数据更新等任务非常实用。下面,我们将深入探讨Oracle游标的使用...

    oracle-游标使用汇总.doc

    Oracle数据库中的游标是处理查询结果集的一种重要机制,尤其在需要逐行处理多行数据时。游标允许我们按照需要遍历查询结果,并对每一行进行操作。本篇文章将详细解析Oracle数据库中游标的使用方法。 首先,游标分为...

    Oracle数据库游标使用大全

    Oracle数据库游标是PL/SQL编程中不可或缺的一部分,它们允许程序逐行处理查询结果,提供了更灵活的数据操作方式。在Oracle数据库中,游标主要分为两种类型:隐式游标和显式游标。 1. **隐式游标**: - 当在PL/SQL...

    非常详细的Oracle游标整理

    Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询的结果集。游标允许我们按需逐行处理数据,而不是一次性加载所有结果。这里详细介绍了Oracle中的三种游标类型:隐式游标、显式游标和REF游标。 1....

    Oracle入门--Oracle游标使用

    Oracle游标是PL/SQL编程中的重要组成部分,主要用于处理单行或多行查询结果。游标允许程序员逐行处理查询结果,而不是一次性加载所有数据。在Oracle中,游标分为显式游标和隐式游标。 1. **隐式游标**:在PL/SQL中...

    Oracle 游标 Oracle 游标

    在Oracle数据库中,游标(Cursor)是处理数据集的一个关键机制,主要用于执行查询并逐行处理结果集。游标可以被视为一个临时存储区,用于保存SELECT语句的结果集,允许程序对这些结果进行迭代访问。 #### 游标的...

    Oracle显式游标和隐式游标.doc

    Oracle 显式游标和隐式游标 Oracle 中的游标是 SQL 的一个内存工作区,由系统或用户以变量的形式定义。游标有两种类型:显式游标和隐式游标。显式游标是一种明确声明的游标,需要在声明部分使用 CURSOR 语句来定义...

    oracle的游标使用

    在Oracle数据库中,游标(Cursor)是一种用于检索并处理多行数据的强大工具。它允许用户通过循环逐条处理查询结果集中的每一行数据,这对于需要进行复杂数据处理的应用程序来说非常有用。 #### 二、游标分类 游标...

    Oracle游标使用大全

    ### Oracle游标使用详解 #### 一、Oracle游标简介 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集。它允许用户通过PL/SQL编程语言逐行访问和处理查询返回的数据记录。游标可以是显式定义的(即在...

    oracle游标使用及实例

    在Oracle数据库中,游标(Cursor)是一种用于处理SQL查询结果集的方式。它允许用户逐行地读取和处理查询结果,这对于需要对每一行数据进行特定操作的情况非常有用。游标可以分为显式游标和隐式游标两种类型。 #### 二...

    Oracle游标使用案例大全

    - 游标(Cursor):它是一个数据库系统中的结构,用于存储执行SQL查询后的结果集信息。游标允许我们遍历结果集,并对每一行进行操作。 - 局部游标和全局游标:局部游标在PL/SQL块中定义,仅在该块的范围内有效;...

    Oracle 游标使用大全

    Oracle游标是数据库管理系统中的一种数据处理机制,它允许用户按需逐行处理查询结果,而不是一次性加载所有数据。在Java编程中,我们通常通过JDBC(Java Database Connectivity)来与Oracle数据库交互,其中游标扮演...

Global site tag (gtag.js) - Google Analytics