zoukankan      html  css  js  c++  java
  • oracle之游标

    Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。

    游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。

    可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用。有两种类型的游标:

      隐式游标

      显式游标

    隐式游标被用于描述执行的SQL命令,PL/SQL中出现的SQL语句,oracle都会自动的为其分配一段私有的内存空间,也就是私有游标区域。

    隐式游标:select * into emp from employees where id=200

    显式游标由开发人员通过程序显式控制,用于从表中取出多行数据,并将多行数据一行一行单独进行处理。

    显示游标的使用:

        可以用于暂存查询取出的多行结果

        按行处理查询返回的多行结果

        在PL/SQL块中通过循环手动控制游标

    游标具有属性(下面为属性的作用)
    测试SQL 命令的结果
    在PL/SQL中类似于使用函数

    通过使用游标的属性,获取游标的状态信息:
    属性 类型 描述
    %ISOPEN Boolean 如果游标打开,则为TRUE
    %NOTFOUND Boolean 如果最近的提取没有返回一条记录,则为TRUE
    %FOUND Boolean 一直为TRUE ,直到最近提取没有取回行记录
    %ROWCOUNT Number 到目前为止,提取的总行数
    后面用循环拿到所有数据的时候会用到属性

    游标的使用

    游标的使用包含几个内容:声明打开获取数据关闭游标4个步骤

    声明游标

    声明游标定义游标的名称和相关的SELECT语句 在DECLARE下声明。

    CURSOR cursor_name IS select_statement;
    在游标声明中,不要包含INTO 子句。
     案例:
      cursor emp_cursor is
      select employee_id,first_name
      from employees ;

    打开游标

    打开游标游标分配内存,使得它准备取的SQL语句转换成它返回的行。例如,我们将打开上述定义的游标如下:

    打开游标将执行查询和取出结果集

    OPEN cursor_name;

    不论查询有没有返回记录,都不会引起异常

    在一次取操作后,通过使用游标属性进行测试游标状态

    OPEN emp_cursor;

    获取游标

    检索当前记录的值到输出变量中。

        FETCH cursor_name INTO variable1, variable2,... ;

       变量应该与游标字段个数相同

       变量与字段顺序也应该一一对应

       测试判断游标是否还包含更多的数据行

    例如:

          fetch emp_cursor into v_empno,v_ename;

       dbms_output.put_line(v_empno||v_ename);

    关闭游标

    关闭游标来释放分配的内存

    CLOSE cursor_name;

    如果需要,必须重新打开游标

    一旦游标已经关闭,不能再提取数据。

    案例1:使用游标拿到一个员工的first_name,salary

    --需求:使用游标拿到员工的first_name,salary

    declare

       firstName employees.first_name%type;

       salary employees.salary%type;

       -- 定义一个游标 (注意:这里可以拿到多行的结果)

       cursor my_cursor isselect first_name,salary from employees;

    begin

       -- 打开游标

       open my_cursor;

            -- 获取一个游标中的数据【属于使用移动光标,取值】

            fetch my_cursor into firstName,salary;

        dbms_output.put_line(firstName||'  '||salary);

       --关闭游标

       close my_cursor;

    end;

    使用循环拿到游标数据

    一:使用简单循环打印所有员工的值

    declare

       -- 定义emp类型

       emp employees%rowtype; //列类型

       -- 定义一个游标:拿到所有员工

       cursor my_corsor is select * from employees;

    begin

      -- 打开游标

      open my_corsor;

      --循环开始打印游标

     loop

           -- 移动光标并获取相应的数据

           fetch my_corsor into emp;

           -- 如果没有相应数据则离开

           exit when my_corsor%notfound;

           -- 没有离开代表有数据,则可以打印展示出来

           dbms_output.put_line(emp.first_name||'  '|| emp.salary);  

     end loop;

     --关闭游标

      close my_corsor;

    end;

    二:使用for循环打印所有员工的值

    PL/SQL语言提供了游标的for循环语句。自动的执行游标的open,fetch和close。当进入循环后,游标for循环语句会自动的打开游标,并提取第一行数据,当程序处理完当前数据后,自动提取下一行数据。当结果集中的内容提取完毕后,自动关闭游标。

    格式:

        FOR variables IN cursor_name(value,value...) LOOP

           --处理语句

        END  LOOP;

     使用:

    declare

          -- 定义一个游标

          cursor cur_emp  is select * from emp where department_id=100;

    begin

      -- 循环这个游标 [自动打开,fetch,关闭]

      -- 当我们把这个游标放到这个for循环的时候,它就会自动打开游标

      -- for循环每次取值,都会自动 fetch

      -- 自己监控当游标的状态为notfound的时候, 就退出循环,关闭游标

      for v_emp in cur_emp

        loop

          dbms_output.put_line(v_emp.first_name ||' '|| v_emp.salary);

        end loop;

    end;

  • 相关阅读:
    QT 创建一个线程播放监控视频
    C++基础(静态数据成员和静态成员函数)
    SDK的使用步骤
    QT加载自带字体
    QT release版QAudioDeviceInfo获取不到音频设备,而debug版可以获取到
    通过vs2015给QT添加模块
    pycharm修改字体与主题
    日志学习(二)——日志处理封装
    日志学习(一)
    配置文件学习(二)--写入配置文件
  • 原文地址:https://www.cnblogs.com/spdboke/p/6872595.html
Copyright © 2011-2022 走看看