1.游标的使用(cursor)

  基本格式:

      定义游标:  cursor 游标名 is select语句(查询要操作的数据);

      自定义参数:参数名1 对应表中的字段1;

            参数名2 对应表中的字段2;

      打开游标:  open 游标名;

              loop(循环)

                fetch ... into ...;   抓取一行到自定义变量里面

                exit when ...%notfound;   退出循环的条件

                具体操作...

              end loop; 关闭循环

      关闭游标:  close 游标名;

    例:  

 declare
cursor cemp is select job,sal from emp; ###定义了一个名称是cemp的游标,游标中的数据是select job,sal from emp;中查询出的数据    
  cjob emp.job%type; ###定义变量cjob,对应emp表中的job字段
  csal emp.sal%type; ###定义变量csal,对应emp表中的sal字段
begin
open cemp; ###打开游标
loop ###循环
fetch cemp into cjob,csal; ###抓取游标中的一行数据赋值给变量cjob,csal
exit when cemp%notfound; ###退出条件:cemp%notfound表示游标没有抓取到数据了
dbms_output.put_line('您的工作为' || cjob || '您的工资为' || csal); ###具体操作:打印工作、工资
end loop; ###结束循环
close cemp; ###关闭游标
end;
/

   -- 游标的四个属性
        1). %isopen 判断游标是否打开
        2). %rowcount 影响的行
        3). %found 还有下一条数据
        4). %notfound 没有下一条数据

      例: --根据emp表员工的职位涨工资,总裁涨1000,经理涨800,其他涨400。

 declare
cursor cemp is select empno,job from emp;
pempno emp.empno%type;
pjob emp.job%type;
begin
open cemp;
loop
fetch cemp into pempno,pjob;
exit when cemp%notfound;
if pjob ='PRESIDENT' then update emp set sal = sal + 1000 where empno = pempno;
elsif pjob='MANAGER' then update emp set sal = sal + 800 where empno = pempno;
else
update emp set sal = sal + 400 where empno = pempno;
end if;
end loop;
close cemp;
end;
/

      注意:elsif 的书写。

   -- 带参数的游标
      例: -- 要查询emp表任意部门的员工信息。(10号部门)

 declare
cursor cemp(pdeptno number) is select empno,ename from emp where deptno = pdeptno;
pempno emp.empno%type;
pname emp.ename%type;
begin
open cemp(10);
loop
fetch cemp into pempno,pname;
exit when cemp%notfound;
dbms_output.put_line(pempno || ' ' || pname );
end loop;
close cemp;
end;
/

2.例外(exception)

    例:

  1  declare
2 pnum number := 0;
3 begin
4 pnum := 1/pnum; -- 会抛出一个叫zero_divide的异常
5* end;
6 /
declare
*
第 1 行出现错误:
ORA-01476: 除数为 0
ORA-06512: 在 line 4

  自定义一个例外(异常)

  1  declare
2 pnum number := 0;
3 begin
4 pnum := 1/pnum; -- 会跑出一个叫zero_divide的异常
5 exception
6 when zero_divide then dbms_output.put_line('不能被0除');
7* end;
SQL> /
不能被0除

    例: -- 查询50号部门的所有员工的姓名,如果没有查到数据抛出列外。

  1  declare
2 cursor cemp is select ename from emp where deptno = 50;
3 pname emp.ename%type;
4 -- 自己定义异常
5 not_emp_data exception;
6 begin
7 open cemp;
8 fetch cemp into pname;
9 if cemp%notfound then
10 dbms_output.put_line('');
11 raise not_emp_data;
12 else
13 loop
14 exit when cemp%notfound;
15 dbms_output.put_line(pname);
16 end loop;
17 end if;
18 close cemp;
19 exception
20 when not_emp_data then dbms_output.put_line('没有找到50号部门的数据');
21* end;
SQL> /
11
没有找到50号部门的数据

  

Oracle Day 08 游标与例外的总结的更多相关文章

  1. (转)oracle 存储过程 带游标作为OUT参数输出

    (转)oracle 存储过程 带游标作为OUT参数输出 存储过程返回OUT参数的游标 例子. 包中带过程 要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 ...

  2. oracle 中的游标

    oracle 中的游标 通俗易懂的sql代码直接上! --简单的游标使用滴呀 --使用FOR OBJ IN OBJS LOOP ......END LOOP; DECLARE CURSOR C_JOB ...

  3. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  4. Oracle中使用游标获取指定数据表的所有字段名对应的字符串

    操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...

  5. oracle超出打开游标的最大数的原因和解决方案

    oracle超出打开游标的最大数的原因和解决方案 分类: Oracle相关2012-06-05 10:36 6362人阅读 评论(0) 收藏 举报 oracle数据库sqljavasessionsys ...

  6. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  7. oracle存储过程和游标的使用

    oracle存储过程和游标的使用 (2011-04-19 14:52:47) 转载▼ 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情 ...

  8. Oracle中的游标(转)

    Oracle中的游标有两种:显式游标.隐式游标.显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入 (insert).删除 ...

  9. Oracle存储过程、游标、函数

    SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数 ...

随机推荐

  1. 我的TDD实践---SVN架设篇

    我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...

  2. NCache:最新发布的.NET平台分布式缓存系统

    NCache:最新发布的.NET平台分布式缓存系统在等待Microsoft完成Velocity这个.NET平台下的分布式内存缓存系统的过程中,现在让我们将目光暂时投向其他已经有所建树的软件开发商.Al ...

  3. hdu 3074 Multiply game(模板级线段树)

    离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树. 纯模板,就是把单点更新,区间求和改为单点更新,区间求积. 1A. #include ...

  4. WebView 实现MiniBrowser

    package org.hjw.minibrowser; import android.os.Bundle; import android.app.Activity; import android.v ...

  5. 使用JavaScript重定向URL参数

    本人从网上查找(如有雷同,不胜荣幸.),并进行了修改,简单粗暴,实现使用JavaScript重置url参数 1.字符拼接形式 function setUri(para, val) { var strN ...

  6. 某大神C#框架后台发送信息的查找及破解

    最近在博客园瞎逛的时候,发现了某个大神发布的一个c#框架,一看框架,叫牛逼框架,嗯,装B效果太好了,界面很炫,虽然有很多的组件还是不怎么完善,但是,已经可以初步运用于项目了. 先来看看界面:   在进 ...

  7. Spring实战——通过Java代码装配bean

    上篇说的是无需半行xml配置完成bean的自动化注入.这篇仍然不要任何xml配置,通过Java代码也能达到同样的效果. 这么说,是要把上篇的料拿出来再煮一遍? 当然不是,上篇我们几乎都在用注解的方式如 ...

  8. 安卓自动化测试工具一:Monkey

    一:monkey的用途:主要用于稳定性测试,模拟用户操作 二.monkey的基本使用 monkey文档地址:"<android_sdk>/docs/tools/help/monk ...

  9. UVa 1395 Slim Span

    问题:给出一个n结点的图,求最大边与最小边差值最小的生成树 my code: #include <iostream> #include <cstdio> #include &l ...

  10. ssh中的 Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

    这个错误我整理了  半天才发现问题的存在. 尝试了网上的很多办法,但是最后都没有达到效果. 包括这两种: 第一种: web.xml种的配置 <filter> <filter-name ...