zoukankan      html  css  js  c++  java
  • orcale 之 PL/SQL的游标

      根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的。这时候我们就需要引入游标来为我们解决问题了。

      我们知道在 PL/SQL 中可以使用数据控制语言(DML)对数据进行操作,而在使用这些的时候 Orcale 会在内存中为其分配一个缓存区。而游标就是指向该缓存区的指针。它可以对查询结果集的每一行数据分别进行单独的处理。

      游标分为显式游标和隐式游标。显式游标是由用户声明操作的一种游标,而隐式游标是 Orcale 为所有的操作语言自动声明和操作的游标。

    显式游标

      对于显式游标的操作分为:声明,打开,提取,关闭。

      1. 声明游标

        在游标的声明中定义了游标的名字而且这个游标和一个 SELECT 关联起来。除此之外显式游标必须在 DEXLARE 中。它的语法如下:

    CURSOR <游标名> IS SELECT <语句>
    

      注意:这里的SELECT 语句是可以带有 UNION 或者 MINUS 的语句。

      2. 打开游标

        语法如下:

    OPEN <游标名>;
    

      打开游标就会执行定义的 SELECT语句,执行完毕后,查询出来的结果会放入内存,游标的指针会指向查询结果的头部,

      3. 提取游标

        打开游标后的工作就是从查询出来的集合进行取值了,取值的语句是 FETCH 语法有两种格式:

    FETCH <游标名> INTO <变量列表>;
    FETCH <游标名> INTO PL/SQL 记录;
    

        FETCH 每执行一次游标会向后移动一次直到结束位置。

      4. 关闭游标

    CLOSE <游标名>;

       5. 例子

    --创建临时表
    create table t_emp
    (	tempne number(4) primary key,
    	tename varchar2(20)
    );
    create table t_emp2
    (	tempne number(4) primary key,
    	tename varchar2(20)
    );
    
    DECLARE
      emp_no number(4); --定义变量
      emp_nanme varchar2(20);
    CURSOR emp_cur IS --定义游标
      SELECT empno, ename 
      FROM emp;
    BEGIN
    OPEN emp_cur; --打开游标
      --将第一行的数据放入变量中,之后游标后移
      FETCH emp_cur INTO emp_no, emp_nanme;
      LOOP
        EXIT WHEN NOT emp_cur%FOUND; --如果游标已经到末尾结束
        IF emp_no = '7839' THEN
          INSERT INTO t_emp values(emp_no,emp_nanme);
        else
          INSERT INTO t_emp2 values(emp_no,emp_nanme);
        END IF;
        FETCH emp_cur INTO emp_no, emp_nanme;
      END LOOP;
    CLOSE emp_cur; --关闭游标
    END;
    /
    

     隐式游标

       上面我们学到了显示游标的使用,接下来我们说下隐式游标。当我们在PL/SQL 中直接使用 SELECT 语句进行操作,则就是隐式的使用了游标,这就是隐式游标。这种游标无需定义,也不需要打开和删除。如下所示

    BEGIN    
        SELECT empno, ename INTO emp_no, emp_nanme FROM emp WHERE empno = 7839;
    END

      对于隐式游标来说必须要有一个 INTO 子句,因此对于隐式游标来说 SELECT 子句的返回值必须只有一行数据。

  • 相关阅读:
    php 使用正则匹配中文 返回结果
    怎样判断一个jquery对象是否为空jquery对象
    关于tp5.0中对象数组转换普通数组使用助手函数collection而不是toArray
    PHP 面试题三
    PHP 面试题二
    PHP 面试题 一
    laravel 学习笔记 —— 神奇的服务容器
    ubuntu下安装opencv库+Python2.7环境安装及开发摄像头拍照应用
    Linux内核分析(七)----并发与竞态
    Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
  • 原文地址:https://www.cnblogs.com/brother-four/p/6512556.html
Copyright © 2011-2022 走看看