两种类型:
    隐式:
        执行INSERT、UPDATE、DELETE 或者只返回一条结果的SELECT语句时默认创建。
    显式:
         执行返回多条结果的SELECT语句时才能创建显式游标,创建时游标可以存储多行记录,但是同一个时间点上只能对一条记录进行处理。

隐式游标
隐式游标属性:
属性
   返回类型

例子

%FOUND

至少一条记录受影响(或者返回)时返回TRUE

SQL%FOUND

没有记录受影响(或者返回)时返回FALSE

%NOTFOUND

没有记录受影响(或者返回)时返回TRUE

SQL%NOTFOUND

至少一条记录受影响(或者返回)时返回FALSE

%ROWCOUNT

返回受影响的记录条数

SQL%ROWCOUNT

例子:

DECLARE  var_rows number(5);
BEGIN
  UPDATE employee 
  SET salary = salary + 1000;
  IF SQL%NOTFOUND THEN
    dbms_output.put_line('None of the salaries where updated');
  ELSIF SQL%FOUND THEN
    var_rows := SQL%ROWCOUNT;
    dbms_output.put_line('Salaries for ' || var_rows || 'employees are updated');
  END IF; 
END; 

显式游标
创建格式:
CURSOR cursor_name IS select_statement;
使用:
  • 在声明部分声明显式游标.
  • 在执行部分打开游标.
  • 将从游标里获取到的数据放到PL/SQL变量或者记录里.
  • 关闭游标.

1) 声明游标:

   DECLARE
   CURSOR cursor_name IS 
   返回多条记录的SELECT语句; 

2) 打开游标:

    OPEN cursor_name;
3) 取数据放到PL/SQL变量或者记录里:

FETCH cursor_name INTO record_name;

    FETCH cursor_name INTO variable_list;  
4) 关闭游标:
    CLOSE cursor_name;
5)注意:  
    当取数据(数据库里一行记录)存到记录里面时,记录和游标的数据结构必须一致。
    当取数据(数据库里一行记录)存到多个变量里时,变量的顺序和游标列的顺序一致。
    游标打开后,第一行被指定为当前行,每当数据被取到变量或者记录里,游标指向下一行。

     试图打开一个在前面操作中没有关闭的游标,程序会报错。

当游标移到最后一行记录的后面,再取数据时,程序会报错。

例子:
1> DECLARE 
2>    emp_rec emp_tbl%rowtype;
3>    CURSOR emp_cur IS 
4>    SELECT *
5>    FROM emp_tbl
6>    WHERE salary > 10; 
7> BEGIN 
8>    OPEN emp_cur; 
9>    FETCH emp_cur INTO emp_rec; 
10>      dbms_output.put_line (emp_rec.first_name || '  ' || emp_rec.last_name); 
11>   CLOSE emp_cur; 
12> END; 

显式游标属性:

属性

返回值

例子

%FOUND

至少获取一条数据时返回TRUE

Cursor_name%FOUND

没有获取到数据时返回FALSE

%NOTFOUND

没有获取到数据时返回TRUE Cursor_name%NOTFOUND
至少获取一条数据时返回FALSE

%ROWCOUNT

获取到的数据条数

Cursor_name%ROWCOUNT

没有取到数据时,报错

%ISOPEN

游标打开时返回TRUE

Cursor_name%ISNAME

游标关闭时返回FALSE

使用简单循环:

1> DECLARE 
2>   CURSOR emp_cur IS 
3>   SELECT first_name, last_name, salary FROM emp_tbl; 
4>   emp_rec emp_cur%rowtype; 
5> BEGIN 
6>   IF NOT emp_cur%ISOPEN THEN 
7>      OPEN emp_cur; 
8>   END IF; 
9>   LOOP 
10>     FETCH emp_cur INTO emp_rec; 
11>     EXIT WHEN emp_cur%NOTFOUND; 
12>     dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
13>     || ' ' ||emp_cur.salary); 
14>  END LOOP;
15>  END; 
16>  / 

使用While循环:

9>   FETCH sales_cur INTO sales_rec;  
10>  WHILE sales_cur%FOUND THEN  
11>  LOOP 
12>    dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
13>    || ' ' ||emp_cur.salary); 
15>    FETCH sales_cur INTO sales_rec; 
16>  END LOOP; 

使用FOR循环:

1> DECLARE 
2>  CURSOR emp_cur IS 
3>  SELECT first_name, last_name, salary FROM emp_tbl; 
4>  emp_rec emp_cur%rowtype; 
5> BEGIN 
6>  FOR emp_rec in sales_cur 
7>  LOOP  
8>  dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name 
9>    || ' ' ||emp_cur.salary);  
10> END LOOP; 
11>END;
12> /

带参数游标

格式:CURSOR cursor_name(parameter_name1 type1,parameter_name2 datetype type2..) IS select_statement;
例子:
1)定义
CURSOR c_emp(no IN emp.empno%TYPE) --或者(no NUMBER)
IS
SELECT * FROM emp
WHERE
empno = no; 2)使用
OPEN c_emp('no1')
FOR r_emp IN c_emp('no1') LOOP...

使用FOR UPDATE 和 WHERE CURRENT的游标

以下内容摘自《Oracle PL/SQL by Example》
使用FOR UPDATE 和 WHERE CURRENT的游标:
FOR UPDATE 能锁定希望更新的行,commit或者rollback 后才会释放锁
没有commit或者rollback时可以在游标中使用WHERE CURRENT OF 检索最新的数据。
 使用:
    在游标定义结尾处加上
    FOR UPDATE [OF item_name]
        
例子:
 1)
        DECLARE
          CURSOR c_course IS
            SELECT course_no,cost
            FROM course FOR UPDATE [OF cost];
        BEGIN
           FOR r_course IN c_course
           LOOP
             IF r_course.cost < 2500
             THEN
               UPDATE course
               SET cost = r_course.cost + 10
               WHERE course_no = r_course.course_no;
             END IF;
            END LOOP;
          END;
          
2) 使用WHERE CURRENT OF子句,可以不用在UPDATE语句中添加对应的WHERE条件
        DECLARE
          CURSOR c_course IS
            SELECT course_no,cost
            FROM course
            WHERE cost < 2500
            FOR UPDATE [OF cost];
        BEGIN
           FOR r_course IN c_course
           LOOP
             UPDATE course
               SET cost = r_course.cost + 10
             WHERE CURRENT OF c_course;
            END LOOP;
          END;




PL/SQL学习(三)游标的更多相关文章

  1. PL/SQL学习笔记之游标

    一:游标 Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句.处理结果等等. 游标指向这一上下文的区域. PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息 ...

  2. PL/SQL -->隐式游标(SQL%FOUND)

    PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...

  3. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  4. PL/SQL学习笔记_02_游标

    在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. 为了处理 SQL 语句, ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处 ...

  5. PL/SQL学习笔记(三)

    -----创建一个序列,再创建一个表(主键是数字),通过序列生成该表的主键值. create table mytb1( m_id number primary key, m_name ) not nu ...

  6. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  7. 五、PL/SQL循环、游标、函数和过程

    --PL/SQL基础知识学习 --一.PL/SQL语句块,基础语法格式 DECLARE --变量声明列表 info varchar(25); --变量声明 stu_unm integer := 15; ...

  8. [Oracle] PL/SQL学习笔记

    -- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...

  9. PL/SQL — 显式游标

    一.游标的相关概念及特性 1.定义 通过游标方式定位到结果集中某个特定的行,然后根据业务需求对该行进行相应特定的操作. 2.分类 显示游标: 用户自定义游标,用于处理select语句返回的多行数据. ...

随机推荐

  1. 拍照返回的bitmap太小

    private void doPhoto(int requestCode) { if(!Environment.getExternalStorageState().equals(Environment ...

  2. Android之发送短信和接收验证码

      最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录    前提---权限     <uses-permission android:name="andro ...

  3. 一篇不错的关于分析MVC的文章

    1 简介 英文原文:MVC vs. MVP vs. MVVM 三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试. 2 MVC/MVP 2.1 ...

  4. Android两个控件叠在一起,如何让被挡住的控件显示出来

    Android两个控件叠在一起,如何让被挡住的控件显示出来 问题 : 两个控件叠在一起,如何让被挡住的控件显示出来? 比如A,B两个控件,A被B挡住,目前A要显示出来,B不能被隐藏,A的高度只有那么一 ...

  5. 释放Linux磁盘空间的一种方法

        1.用df 检查发现/根目录可用空间为0   [root@/]#df -h   2.用du检查发现 各目录占用的空间都很少,有约3G的空间莫名其妙地丢了.   [root@/]# du -m ...

  6. 如何测试mysql是否安装成功

    1.命令行:net start mysql如果能启动,那说明安装成功了.如果想查询默认的数据库,你可以用mysqlfont,或者直接命令行操作进入安装目录下的bin文件夹,或者配置好环境变量,然后2. ...

  7. (原创)speex与wav格式音频文件的互相转换

    我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...

  8. SpringMVC——项目启动时从数据库查询数据

    SpringMVC项目中遇到这样的问题: 1.很多数据字典需要从数据库中查询: 2.懒得修改SQL语句: 3.想在项目中声明静态变量存储数据字典,但是希望这个字典可以在项目启动时进行加载. 当遇到这样 ...

  9. Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例

    1. 模拟斗地主洗牌和发牌并对牌进行排序的原理图解: 2. 代码实现: 思路: • 创建一个HashMap集合 • 创建一个ArrayList集合 • 创建花色数组和点数数组 • 从0开始往HashM ...

  10. 简单的实现QQ通信功能(五)

    第五部分:聊天界面的设计及代码 一:效果图及界面设计 1. 效果图: 2. 界面设计: (1)左上角显示朋友的头像和“某某正在和某某聊天”. (2)中间的聊天窗口用了一个ListView,视图用详细信 ...