zoukankan      html  css  js  c++  java
  • Oracle游标简介与使用

    简介

    游标是一个指向查询结果集的指针,PL/SQL有两种游标,分别是显式游标和隐式游标。

    隐式游标

    当Oracle执行 SELECT INTOINSERTUPDATEDELETE SQL语句时,它会自动的创建一个隐式游标,Oracle内部管理整个隐式游标的整个执行周期,并且只暴漏出游标的信息和状态,例如:SQL%ROWCOUNTSQL%ISOPENSQL%FOUNDSQL%NOTFOUND。当查询返回零行或多行时,隐式游标不够优雅,这会分别导致NO_DATA_FOUNDTOO_MANY_ROWS异常。

    显示游标

    显式游标是在当前块或包规范的声明部位中显式声明的SELECT语句。你可以控制显式游标的整个执行周期从OPENFETCHCLOSE。Oracle定义了一个执行周期来执行SQL语句并将游标与之关联。

    1.声明一个游标

    在使用显式游标之前,你必须声明它。

    CURSOR cursor_name IS query

    上句中,首先在CURSOR关键字之后指定了游标的名字,然后在IS关键字后定义了一个获取数据的查询。

    2.打开游标

    在开始从游标中获取行之前,你必须先打开游标,你可以使用下面的语法来打开游标。

    OPEN cursor_name

    在这句话中,cursor_name是在声明部分所声明游标的名字。

    当你打开游标,Oracle会解析查询,绑定变量并且执行所关联的SQL语句。Oracle也决定了执行计划,将变量和游标参数与SQL语句中的占位符相关联,确定结果集,并将游标设置到结果集中的第一行。

    3.从游标中获取数据

    FETCH将游标所指向的当前行放置到变量中,语法如下

    FETCH cursor_name INTO variable_list

    为了获取结果集中的所有行,你必须使用FETCH获取每一行直至最后一行。

    4.关闭游标

    在获取到所有行之后,你必须使用CLOSE语句关闭游标。

    CLOSE cursor_name

    关闭游标会使Oracle在适当的时机释放所占用的内存。

    如果你在匿名块、存储过程或者函数中声明游标,在这些对象执行结束时游标也会自动的关闭。

    5.显示游标的属性

    一个游标有四个属性,你可以使用以下语法来引用他们

    cursor_name%attrribute

    cursor_name是显式游标的名称

    %ISOPEN

    如果游标打开了,该属性就为TRUE否则为FALSE

    %FOUND

    这个属性有四个值

    • NULL:在第一次获取数据之前
    • TRUE:一条记录成功的被获取到
    • FALSE:没有记录返回
    • INVALID_CURSOR:游标没有打开

    %NOTFOUND

    这个属性也有四个值

    • NULL:在第一次获取数据之前
    • FALSE:一条记录成功的被获取到
    • TRUE:没有记录返回
    • INVALID_CURSOR:游标没有打开

    %ROWCOUNT

    该属性反悔了从游标中获取的记录数,若游标未打开,则该属性返回INVALID_CURSOR

    示例

    declare 
           --类型定义
           cursor c_job
           is
           select empno,ename,job,sal
           from emp
           where job='MANAGER';
           --定义一个游标变量
           c_row c_job%rowtype;
    begin
           open c_job;
             loop
               --提取一行数据到c_row
               fetch c_job into c_row;
               --判读是否提取到值,没取到值就退出
               --取到值c_job%notfound 是false 
               --取不到值c_job%notfound 是true
               exit when c_job%notfound;
                dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
             end loop;
           --关闭游标
          close c_job;
    end;

    参考:https://www.oracletutorial.com/plsql-tutorial/plsql-cursor/

  • 相关阅读:
    洛谷月赛 Hello World(升级版)
    codevs1001 舒适的路线
    vijos & codevs 能量项链
    vijos 运输计划
    noip2016普及组题解和心得
    UVa 10891 Game of Sum
    UVa 10635 Prince and Princess
    某模拟题题解 2016.11.17
    贪心入门题
    某模拟题题解 2016.11.16
  • 原文地址:https://www.cnblogs.com/MrZhaoyx/p/13389505.html
Copyright © 2011-2022 走看看