zoukankan      html  css  js  c++  java
  • Oracle 游标

    一、游标
      游标又称光标,是SQL 的的一个内存工作区,由系统或用户以变量的形式定义,主要用于暂时存放受SQL语句影响到的所有数据。换句话说,数据库会将受SQL影响的数据暂时存放到一个内存区域的虚表中,这个虚表就是游标
      游标有两种类型:隐式游标和显式游标。
      隐式游标:单行 select...into... 语句以及对数据库的 DML 操作都会自动创建隐式游标,用于暂时保存操作结果。简单地讲,凡是能够回滚的操作都会创建隐式游标
      显式游标:一个显示游标对应一个返回结果为多行多列的 SELECT 语句,类似于 Java 语法中的ResultSet 对象。如果要提取多行数据,就需要自定义一个显示游标,并用右边保存待提取的多行数据,最后再逐行处理。
       游标的属性:
                         %rowcount  受 SQL 影响的行数,即游标中包含的行数
                         %found     布尔值,游标中是否还有数据
                         %notfound     布尔值,游标中是否已无数据
                         %isopen    游标是否打开

    二、游标示例
      1.以下代码定义了一个游标 cemp,用于保存所有员工的 first_name 和 salary 值,然后再通过循环语句取出游标 cemp 中的每行记录并打印。

    declare
        cursor cemp                  --游标 cemp 没有定义参数。
        is select first_name,salary
        from employees;
        pename employees.first_name%type;
        psal employees.salary%type;
    begin
        open cemp;
        loop
          -- 依次取出每条记录
          fetch cemp into pename,psal;
          -- 退出条件:没有提取到记录
          exit when cemp%notfound;
          dbms_output.put_line(pename||'的薪水是'||psal);
        end loop;
        close cemp;
    end;

      2.使用带参光标 cursor ,查询10号部门的员工姓名和工资。

    declare
        cursor cemp(d_id emp.deptno%type) is select emp.ename,emp.sal from emp where d_id=emp.deptno;
        pname emp.ename%type;
        psal  emp.sal%type;
    begin
        open cemp(&d_id); --打开带参光标的语法形式
        loop
          fetch cemp into pname,psal ;
          exit when cemp%notfound;
          dbms_output.put_line(pname ||'的工资是'|| psal);
        end loop;
        close cemp;
    end;

    执行程序

    输出结果

      3.从部门表中找到最大的部门号,将其输出到屏幕。
      因为存储过程是完成特定任务比如增删改、而函数主要计算数据返回结果值,所以本题用游标 。

    declare
        cursor cemp is select dept.deptno from dept;
        d_id1 dept.deptno%type :=0;
        d_id2 dept.deptno%type :=0;
    begin
        open cemp;
        loop
          fetch cemp into d_id1;
          exit when cemp%notfound;
          if d_id1 > d_id2 then
            begin
              select dept.deptno into d_id2 from dept where dept.deptno = d_id1;
            end;
          end if;
        end loop;
        close cemp;
        dbms_output.put_line('最大部门号:'||d_id2);
    end;

    输出结果

    注意】:
    ①函数 dbms_output.put_line() 是输出函数。在sql 窗口的调用方式为:
    begin
      dbms_output.put_line();
    end;
    ②函数 loop...end loop ; 是循环函数。
    ③打开带参光标的语法形式:
        open cname(&参数1,&参数2,...)

    三、
    1.声明游标
    在可执行部分,按以下格式声明游标;

    CURSOR cname[(参数1 数据类型1,参数2 数据类型2,...)]
    IS SELECT 语句;

    2.打开游标
    在可执行部分,按以下格式打开游标;

    OPEN cname[(实际参数1,实际参数2,...)];

    3.提取数据
    在可执行部分,按以下格式将游标工作区中的数据提取到变量中;

    FETCH cname INTO 变量名1[,变量名2,...];

    4.关闭游标
    游标使用完毕后,就需要执行关闭的命令,代码如下:

    CLOSE cname;

     【游标能与用户自定义异常一起使用】

  • 相关阅读:
    ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
    TDD个人实践体会
    客户端调用Spring.Net发布的WebService
    XML自动解析器开源
    Javascript MVVM模式前端框架—Knockout 2.1.0系列
    定时执行SQL存储过程
    orchard之lucene.net索引生成
    并发编程学习总结
    python开发总结
    Thrift
  • 原文地址:https://www.cnblogs.com/jiaxinwei/p/10300585.html
Copyright © 2011-2022 走看看