`
as619864232
  • 浏览: 326502 次
社区版块
存档分类
最新评论

Oracle 中的游标用法

阅读更多

 

循环将游标中的数据提取出来并放置2个变量中输出

SQL> declare
  2    cursor dept_cur is select d.deptno,d.dname from scott.dept d;
  3    dno scott.dept.deptno%type;
  4    dnm scott.dept.dname%type;
  5  begin
  6    open dept_cur;
  7    loop
  8      fetch dept_cur into dno,dnm;
  9      exit when dept_cur%notfound;
 10      dbms_output.put_line(dno||' '||dnm);
 11    end loop;
 12    close dept_cur;
 13  end;
 14  /
 
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

循环将游标中的数据提取出来并放置 PL/SQL 记录中输出

declare
  cursor dept_cur is select d.deptno,d.dname from scott.dept d;
  type dept_record_type is record(
    dno scott.dept.deptno%type,
    dnm scott.dept.dname%type
  );
  dept_record dept_record_type;
begin
  open dept_cur;
  loop
    fetch dept_cur into dept_record;
    exit when dept_cur%notfound;
    dbms_output.put_line(dept_record.dno||' '||dept_record.dnm);
  end loop;
  close dept_cur;
end;
 
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

 

将游标中的所有数据一次性提取出来并放置 PL/SQL 记录表中循环输出

SQL> declare
  2    cursor dept_cur is select d.deptno,d.dname from scott.dept d;
  3    type dept_record_type is record(
  4      dno scott.dept.deptno%type,
  5      dnm scott.dept.dname%type
  6    );
  7    dept_record dept_record_type;
  8  begin
  9    open dept_cur;
 10    loop
 11      fetch dept_cur into dept_record;
 12      exit when dept_cur%notfound;
 13      dbms_output.put_line(dept_record.dno||' '||dept_record.dnm);
 14    end loop;
 15    close dept_cur;
 16  end;
 17  /
 
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

 

每次从游标中提取指定行记录放置 PL/SQL 记录表中并循环输出

SQL> declare
  2    cursor my_cur is select e.empno,e.ename from scott.emp e;
  3    type emp_record_type is record(
  4      eno scott.emp.empno%type,
  5      enm scott.emp.ename%type
  6    );
  7    type emp_table_type is table of emp_record_type;
  8    emp_table emp_table_type;
  9    r int:=5;
 10  begin
 11    open my_cur;
 12    loop
 13      fetch my_cur bulk collect into emp_table limit r;    --批量处理不需要初始化变量大小 
 14      for i in 1..emp_table.count loop
 15        dbms_output.put_line(emp_table(i).eno||' '||emp_table(i).enm);
 16      end loop;
 17      exit when my_cur%notfound;
 18    end loop;
 19    close my_cur;
 20  end;
 21  /
 
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

 

将游标作为数据类型赋值后循环输出

SQL> declare
  2    cursor my_cur is select e.empno,e.ename from scott.emp e;
  3    type emp_table_type is table of my_cur%rowtype;
  4    emp_table emp_table_type;
  5    r int:=5;
  6  begin
  7    open my_cur;
  8    loop
  9      fetch my_cur bulk collect into emp_table limit r;
 10      for i in 1..emp_table.count loop
 11        dbms_output.put_line(emp_table(i).empno||' '||emp_table(i).ename);
 12      end loop;
 13      exit when my_cur%notfound;
 14    end loop;
 15    close my_cur;
 16  end;
 17  /
 
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

 

 

带参游标的使用

SQL> declare
  2    cursor my_cur(eno int) is select e.empno,e.ename from scott.emp e where empno=eno;
  3    emp_table my_cur%rowtype;
  4  begin
  5    open my_cur(7788);
  6    fetch my_cur into emp_table;
  7    dbms_output.put_line(emp_table.empno||' '||emp_table.ename);
  8    close my_cur;
  9  end;
 10  /
 
7788 SCOTT

SQL> declare
  2    cursor my_cur(eno int defalut 7788) is select e.empno,e.ename from scott.emp e where empno=eno;
  3    emp_table my_cur%rowtype;
  4  begin
  5    open my_cur;
  6    fetch my_cur into emp_table;
  7    dbms_output.put_line(emp_table.empno||' '||emp_table.ename);
  8    close my_cur;
  9  end;
 10  /
 
7788 SCOTT
 

 

使用游标更新数据

declare
  cursor my_cur is select e.sal from emp e for update;
  v_oldsal emp.sal%type;
begin
  open my_cur;
  loop
    fetch my_cur into v_oldsal;
    exit when my_cur%notfound;
    if v_oldsal < 2000 then
    null;
      update emp set sal=sal+100 where current of my_cur;
    end if;
  end loop;
  close my_cur;
end;

 

 

使用游标删除数据

declare
  cursor my_cur is select deptno from emp2 for update;
  dno dept.deptno%type;
begin
  open my_cur;
  loop
    fetch my_cur into dno;
    exit when my_cur%notfound;
    if dno = 20 then
      delete from emp2 where current of my_cur;
    end if;
  end loop;
  close my_cur;
end;

 

 

使用游标 FOR 循环

SQL> set serveroutput on
SQL> declare
  2    cursor my_cur is select e.empno,e.ename from scott.emp e;
  3    myemp my_cur%rowtype;
  4  begin
  5    for myemp in my_cur loop
  6      dbms_output.put_line('第'||my_cur%rowcount||'个员工:'||myemp.ename);
  7    end loop;
  8  end;
  9  /
 
第1个员工:SMITH
第2个员工:ALLEN
第3个员工:WARD
第4个员工:JONES
第5个员工:MARTIN
第6个员工:BLAKE
第7个员工:CLARK
第8个员工:SCOTT
第9个员工:KING
第10个员工:TURNER
第11个员工:ADAMS
第12个员工:JAMES
第13个员工:FORD
第14个员工:MILLER
 
PL/SQL procedure successfully completed

 

在 FOR 循环中使用子查询

SQL> declare
  2  begin
  3    for emp_record in (select ename,sal from emp) loop
  4      dbms_output.put_line(emp_record.ename);
  5    end loop;
  6  end;
  7  /
 
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
 
PL/SQL procedure successfully completed


使用游标变量

 

declare
  type ref_type_myc is ref cursor return emp%rowtype;
  my_cur ref_type_myc;
  type emp_table_type is table of emp%rowtype;
  emp_table emp_table_type;
begin
  open my_cur for select * from emp;
  fetch my_cur bulk collect into emp_table;
  for i in 1..emp_table.count loop
    dbms_output.put_line(emp_table(i).ename);
  end loop;
end;


嵌套游标的使用

 

SQL> set serverout on;
SQL> declare
  2    type my_refcur_type is ref cursor;
  3    my_refcur my_refcur_type;
  4    cursor my_cur is
  5      select d.dname,cursor(select ename,sal from emp where deptno=d.deptno) from dept d;
  6    dnm dept.dname%type;
  7    enm emp.ename%type;
  8    sal emp.sal%type;
  9  begin
 10    open my_cur;
 11    loop
 12      fetch my_cur into dnm,my_refcur;
 13      exit when my_cur%notfound;
 14      dbms_output.put_line(dnm);
 15      loop
 16        fetch my_refcur into enm,sal;
 17        exit when my_refcur%notfound;
 18        dbms_output.put_line(enm||' '||sal);
 19      end loop;
 20    end loop;
 21  end;
 22  /
 
ACCOUNTING
CLARK 2695
KING 5500
MILLER 1530
RESEARCH
SMITH 900
JONES 2975
SCOTT 3000
ADAMS 1200
FORD 3000
SALES
ALLEN 1860
WARD 1475
MARTIN 1475
BLAKE 3135
TURNER 1750
JAMES 1145
OPERATIONS
 
PL/SQL procedure successfully completed
分享到:
评论

相关推荐

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

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

    oracle数据库游标使用例子

    3. **游标的使用方法**: - **声明游标**:使用`DECLARE`关键字定义游标,指定查询语句和返回的数据类型。 - **打开游标**:使用`OPEN`语句打开游标,准备进行`FETCH`操作。 - **提取数据**:使用`FETCH`语句从...

    Oracle数据库游标使用.rar

    Oracle数据库游标是数据库编程中的一个重要概念,尤其在处理大量数据时,它们提供了一种有效且灵活的方法。游标允许程序逐行访问查询结果集,而不是一次性加载所有数据。这在处理复杂的数据操作,如循环处理、条件...

    Oracle游标使用方法及语法大全

    Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...

    Oracle的游标学习

    在这个主题中,我们将深入探讨游标的定义、类型、使用方法以及在实际应用中的重要性。 游标(Cursor)在数据库中扮演着数据指针的角色,它允许我们在结果集中移动,读取单个记录或更新特定行。Oracle提供两种类型的...

    oracle-游标使用汇总.doc

    本篇文章将详细解析Oracle数据库中游标的使用方法。 首先,游标分为隐式游标和显式游标。隐式游标是由PL/SQL引擎自动管理的,通常在单行查询中使用,如`SELECT INTO`语句。而显式游标则是程序员在PL/SQL块中明确...

    Oracle游标使用方法及语法大全.doc

    ### Oracle游标使用详解 #### 一、游标概述 游标是Oracle数据库中用于处理查询结果集的强大工具,尤其适用于需要逐行处理查询结果的情况。在Oracle中,游标可以分为两类:**显式游标**和**隐式游标**。 1. **隐式...

    oracle数据库的游标

    游标的类型、属性、循环使用方法以及异常处理,都是理解和掌握游标操作的必要知识。随着Oracle数据库的不断更新和发展,对于初学者和数据库管理员来说,学习和使用游标是数据库管理和编程中必不可少的技能之一。

    oracle函数触发器游标等几个小例子

    在`oracle游标.txt`中,你可以学习到如何声明、打开、读取和关闭游标。游标在处理大量数据时非常有用,特别是在需要逐行处理或循环遍历结果集的情况下。例如,如果你需要更新数据库中满足特定条件的所有行,游标将是...

    Oracle 游标使用大全

    这篇文档《Oracle 游标使用大全》应该涵盖了关于Oracle游标的各种使用方法和最佳实践。 1. **游标的定义与类型** - 游标(Cursor)是数据库系统中一个概念,用于跟踪查询结果集中的当前位置。 - Oracle游标有两种...

    Oracle 游标使用大全.pdf

    通过本篇Oracle游标的使用大全,我们可以了解到Oracle数据库游标的类型、属性以及如何在PL/SQL中实现对数据集的逐行处理。这不仅有助于提升程序员的编程技能,也能使他们更深入地理解PL/SQL与Oracle数据库之间的交互...

    Oracle游标使用详解

    根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...

    oracle的游标使用

    ### Oracle的游标使用详解 #### 一、游标概念介绍 在Oracle数据库中,游标(Cursor)是一种用于检索并处理多行数据的强大工具。...熟练掌握游标的使用方法,能够极大地提高开发效率并优化应用程序性能。

    Oracle游标使用案例大全

    本资源“Oracle游标使用案例大全”提供了一系列实用的示例,旨在帮助学习者深入理解和掌握Oracle游标的用法。 1. **游标的基本概念** - 游标(Cursor):它是一个数据库系统中的结构,用于存储执行SQL查询后的结果...

    Oracle游标使用方法及语法大全[整理].pdf

    Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询返回的多行结果集。在PL/SQL中,游标分为隐式游标和显式游标。 1. **隐式游标**:在PL/SQL中,每当执行一个SELECT语句时,系统会自动打开一个隐式...

    oracle循环游标

    在Oracle数据库中,...综上所述,Oracle中的循环游标、序列、异常处理、ROWID定位和高级游标用法都是开发高效、健壮的数据库应用程序所必需的关键技术。掌握这些技术,可以让你在处理复杂数据库任务时更加得心应手。

    关于游标的说明与使用方法

    ### 关于游标的说明与使用方法 #### 一、什么是游标? 在数据库技术中,**游标**是一种用于检索查询结果集中的数据的方式。它允许用户逐行处理记录集,而不是一次处理整个记录集。这使得游标成为处理大量数据时的...

    Oracle 游标 Oracle 游标

    综上所述,Oracle游标及其相关概念是PL/SQL编程中不可或缺的一部分,它们为数据处理提供了强大的工具和灵活性。正确理解和运用游标、%TYPE属性、DML语句以及事务控制等概念,对于高效开发和维护Oracle数据库应用程序...

Global site tag (gtag.js) - Google Analytics