zoukankan      html  css  js  c++  java
  • Oracle Cursor

    1、概念

    游标:从字面来理解就是游动的光标。用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。

    2、分类

    2.1、静态游标:显式游标、隐式游标

    2.2、动态游标:强类型(限制)、弱类型(非限制)

    3、属性

    3.1、%ISOPEN    判断游标是否被打开,若打开,则%ISOPEN等于TRUE;否则等于FALSE。

    3.2、%FOUND    判断游标所在行是否有效。若有效,则%FOUND等于TRUE;否则等于FALSE。

    3.3、%NOTFOUND   与%FOUND相似,功能相反。

    3.4、%ROWCOUNT  返回到当前位置为止,游标所读取的记录行数。

    4、详细说明

    4.1、显式游标:

    Cursor 游标名(参数) [返回值类型] Is Select语句

    OPEN 游标名(参数)

    FETCH 游标名(参数) INTO 变量

    CLOSE 游标名(参数)

    4.2、隐式游标:

    select **** into **** from **** where ****

    for var_name in (select ****)

    loop

    end loop

    for var_name in (游标名(参数))

    loop

    end loop

    4.3、动态游标

    动态游标,在运行的时候才能确定游标使用的查询。分类:
    1.强类型(限制)REF CURSOR,规定返回类型
    2.弱类型(非限制)REF CURSOR,不规定返回类型,可以获取任何结果集。

    5、举例:

    5.1、静态显式游标

    1 set serveroutput on;
    2 declare
    3 r_d2tlog d2t_Log%rowtype;
    4 cursor cs_d2tlog is select * from d2t_log;
    5 begin
    6 open cs_d2tlog;
    7 loop
    8 fetch cs_d2tlog into r_d2tlog;
    9 exit when cs_d2tlog%notfound;
    10 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||cs_d2tlog%rowcount);
    11 end loop;
    12 close cs_d2tlog;
    13 end;
    14 /

    5.2、动态弱类型游标

    1 declare
    2 r_d2tlog d2t_Log%rowtype;
    3 type d2tlog is ref cursor;
    4 t_d2tlog d2tlog;
    5 begin
    6 open t_d2tlog for select * from d2t_log;
    7 loop
    8 fetch t_d2tlog into r_d2tlog;
    9 exit when t_d2tlog%notfound;
    10 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||t_d2tlog%rowcount);
    11 end loop;
    12 close t_d2tlog;
    13 end;
    14 /
    15

    5.3、动态强类型游标

    1 declare
    2 l_sqlstr varchar2(100);
    3 type t_d2tlog is record(
    4 activeid number(30),
    5 writedate date
    6 );
    7 type c_d2tlog is ref cursor return t_d2tlog;
    8 st_d2tlog t_d2tlog;
    9 sc_d2tlog c_d2tlog;
    10 begin
    11 open sc_d2tlog for select activeid,writedate from d2t_log;
    12 loop
    13 fetch sc_d2tlog into st_d2tlog;
    14 exit when sc_d2tlog%notfound;
    15 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount);
    16 end loop;
    17 close sc_d2tlog;
    18
    19 open sc_d2tlog for select activeid,writedate from d2t_log where activeid=130208;
    20 loop
    21 fetch sc_d2tlog into st_d2tlog;
    22 exit when sc_d2tlog%notfound;
    23 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount);
    24 end loop;
    25 close sc_d2tlog;
    26
    27 /*
    28 l_sqlstr:='select activeid,writedate from d2t_log where activeid=124531';
    29 open sc_d2tlog for l_sqlstr;
    30 loop
    31 fetch sc_d2tlog into st_d2tlog;
    32 exit when sc_d2tlog%notfound;
    33 dbms_output.put_line('activeid='||st_d2tlog.activeid||';is already read counts='||sc_d2tlog%rowcount);
    34 end loop;
    35 close sc_d2tlog;
    36 */
    37 end;
    38 /

    5.4、动态强类型游标

    1 declare
    2 r_d2tlog d2t_log%rowtype;
    3 type cursor1 is ref cursor;
    4 type cursor2 is ref cursor return d2t_log%rowtype;
    5
    6 cs_cursor2 cursor2;
    7 begin
    8 dbms_output.put_line('dynamic cursor define ok');
    9
    10 open cs_cursor2 for select * from d2t_log;
    11 loop
    12 fetch cs_cursor2 into r_d2tlog;
    13 exit when cs_cursor2%notfound;
    14 dbms_output.put_line('activeid='||r_d2tlog.activeid||';is already read counts='||cs_cursor2%rowcount);
    15 end loop;
    16 close cs_cursor2;
    17 end;
    18 /

    5.5、游标定义

    1 declare
    2 r_d2tlog d2t_log%rowtype;
    3 type cursor1 is ref cursor;
    4 type cursor2 is ref cursor return r_d2tlog;
    5 begin
    6 dbms_output.put_line('dynamic cursor define error');
    7 end;
    8 /
  • 相关阅读:
    浅谈 facebook .net sdk 应用
    数据库中各种字符串的截取函数
    初、中、高级测试工程师面试题汇总(附答案)
    包管理器 scoop
    ModuleNotFoundError: No module named 'pymouse'解决办法
    Python 正则表达式(分组)
    7个Python实战项目代码,让你分分钟晋级大神!
    经典SQL查询题目
    linux中软件的安装和卸载方法
    测试常用工具
  • 原文地址:https://www.cnblogs.com/advocate/p/1902578.html
Copyright © 2011-2022 走看看