一、游标

  1.概念

    游标是一个 指向上下文的句柄( handle) 或指针。通过游标,PL/SQL 可以控制上下文区和处理语句时上下文区会发生些什么事情。

  2.游标处理

    处理显式游标

    主要包含以下四个步骤:

      1.定义游标

CURSOR cursor_name[(parameter[, parameter]…)] IS select_statement;
游标参数只能为输入参数,其格式为:
parameter_name [IN] datatype [{:= | DEFAULT} expression]
在指定数据类型时,不能使用长度约束。如 NUMBER(4)、CHAR(10) 等都是错误的。

      2.打开游标

--就是执行游标所对应的 SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
--参数支持位置表示法和名称表示法

      3.提取游标数据(放入变量或记录类型)

FETCH cursor_name INTO {variable_list | record_variable };

      4.关闭游标

CLOSE cursor_name;

     游标相关属性:

%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 TRUE;
%NOTFOUND 布尔型属性,与%FOUND 相反;
%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。

   简单示例:——WHILE循环

--打印80部门所有员工的工资
DECLARE
v_sal employees.salary%type;
--1.定义游标
CURSOR emp_sal_cursor IS SELECT salary FROM employees WHERE department_id = 80;
BEGIN
--2.打开游标
OPEN emp_sal_cursor;
--3.提取游标数据(取出当前游标的指向的数据)
FETCH emp_sal_cursor INTO v_sal;
--循环操作found类似迭代器的hasNext()
WHILE emp_sal_cursor%found LOOP
dbms_output.put_line('salary:'||v_sal);
--再取一次
FETCH emp_sal_cursor INTO v_sal;
END LOOP;
--4.关闭游标
CLOSE emp_sal_cursor;
END;

  //当然可以使用多个变量甚至可以使用记录类型进行操作!

 带参数的示例如下:

  

  游标的FOR循环:   

  PL/SQL 语言提供了 游标 FOR 循环语句,自动执行游标的 OPEN 、FETCH 、CLOSE 语句和 循环 语句的功能
当进入循环时,游标 FOR 循环语句 自动 打开游标,并提取第一行游标数据,当程序处理完 当前所提取的数
据而进入下一次循环时,游标 FOR 循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有
数据行后结束循环,并自动关闭游标。

FOR index_variable IN cursor_name[value[, value]…] LOOP
-- 游标数据处理代码
END LOOP;
index_variable 为游标 FOR 循环语句隐含声明的索引变量,该变量为 记录变量,其 结构与游标查询语句
返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,
index_variable 中各元素的名称与游标查询语句选择列表中所制定的列名相同。 如果在游标查询语句的选择
列表中存在计算列,则必须为这些计算列指定别名后才能通过游标 FOR 循环语句中的索引变量来访问这些
列数据

  示例:

--打印80部门所有员工的工资
DECLARE
v_sal employees.salary%type;
--1.定义游标
CURSOR emp_sal_cursor IS SELECT salary,employee_id FROM employees WHERE department_id = 80;
BEGIN
FOR c IN emp_sal_cursor LOOP
dbms_output.put_line('salary:'||c.salary||',employee_id:'||c.employee_id);
END LOOP;
END;

    处理隐式游标

  显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些 由系统隐含创建的游标称为隐式游标, 隐式游标的名字为 SQL,这是由 ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE 系统自动地完成,无需用户进行处理。 用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条 SQL 语句所包含的数据。

SQL%

    游标属性:

SQL%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 TRUE;
SQL%NOTFOUND 布尔型属性,与%FOUND 相反;
SQL %ROWCOUNT 数字型属性, 返回已从游标中读取得记录数;
SQL %ISOPEN 布尔型属性, 取值总是 FALSE。SQL 命令执行完毕立即关闭隐式游标

  示例:

--打印员工信息
DECLARE
v_sal employees.last_name%type;
-- &v_id表示v_id将由外部输入
v_id employees.employee_id%type := &v_id;
BEGIN
UPDATE employees
SET salary = salary*1.2
WHERE employee_id = v_id; IF SQL%NOTFOUND THEN
dbms_output.put_line('查无此人!');
END IF;
END;

  更多游标相关,参考:https://www.cnblogs.com/xcre/archive/2012/03/28/2420597.html

二、异常处理

  主要分为三类异常:

    1. 预定义 ( Predefined )错误

      ORACLE 预定义的异常情况大约有 24 个。对这种异常情况的处理,无需在程序中定义,由 由 ORACLE 自动将其引发。

    2.非预定义 ( Predefined )错误

      即其他标准的 ORACLE 错误。对这种异常情况的处理,需要用户在程序中定义,然后由 ORACLE 自动将其引发。

    3.用户定义(User_define) 错误

      程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理, 需要 用户在程序中定义,然后显式地在程序中将其引发。

    1.预定义异常处理

      主要预定义异常如下:

      

       

    示例:

--打印员工信息
DECLARE
v_sal employees.salary%type;
v_id employees.employee_id%type:=&v_id;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = v_id;
dbms_output.put_line('salary:'||v_sal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('找不到数据!');
WHEN OTHERS THEN
dbms_output.put_line('其他异常!');
END;

    2.非预定义异常处理

    三步走:

       定义异常情况

      与标准的 ORACLE  错误联系起来(也就是说这个错误Oracle有自己的错误代码,但是不在上表中出现),使用 PRAGMA EXCEPTION_INIT

          PRAGMA EXCEPTION_INIT(< 异常情况>, < 错误代码>)

       做出相应的处理

    示例:

DECLARE
--定义异常
e_del EXCEPTION;
--关联异常
PRAGMA EXCEPTION_INIT(e_del,-2292);
BEGIN
DELETE FROM departments WHERE department_id = 10;
EXCEPTION
WHEN e_del THEN
dbms_output.put_line('无法删除包含外键的数据');
END;

    3.用户自定义异常

    需要使用RAISE显式触发异常,并且自定义异常的异常代码必须是–20,000 到 –20,999 之间的参数

    三步走:

      定义异常情况

      RAISE < 异常情况>

      做出相应的处理

  示例:

DECLARE
--定义异常
e_sal EXCEPTION;
v_sal employees.salary%type;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = 100;
IF v_sal < 30000 THEN
RAISE e_sal;
END IF;
EXCEPTION
WHEN e_sal THEN
dbms_output.put_line('工资太低!');
END;

PL/SQL轻量版(三)——游标与异常处理的更多相关文章

  1. PL/SQL轻量版(四)——存储函数/存储过程与触发器

    概述 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数 ...

  2. PL/SQL轻量版(一)——入门介绍

    一.概述 1.概念对比: SQL:结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目 ...

  3. oracle从入门到精通复习笔记续集之PL/SQL(轻量版)

    复习内容: PL/SQL的基本语法.记录类型.流程控制.游标的使用. 异常处理机制.存储函数/存储过程.触发器. 为方便大家跟着我的笔记练习,为此提供数据库表文件给大家下载:点我下载 为了要有输出的结 ...

  4. PL/SQL轻量版(二)——基本语法

    一.流程控制 1.条件判断 语法: IF <布尔表达式> THEN PL/SQL 和 SQL语句 END IF; IF <布尔表达式> THEN PL/SQL 和 SQL语句 ...

  5. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  6. PL/SQL 编程(二)游标、存储过程、函数

    游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针, ...

  7. 基于Node和Electron开发了轻量版API接口请求调试工具——Post-Tool

    Electron 是一个使用 JavaScript.HTML 和 CSS 构建桌面应用程序的框架. 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 Java ...

  8. [PL/SQL工具]绿色版PLSQL工具登录时提示初始化失败,无法锁定OCI.dll错误

    问题现象:使用绿色版PL/SQL工具进行登录时报如下截图错误: 问题描述:初始化失败,无法锁定oci.dll 解决方法:在PLSQL的菜单栏里依次选择 工具->首选项,在OCI库(自动检测为空) ...

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

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

随机推荐

  1. 重装win7系统的过程

    U盘重装系统准备工作: 1.下载一个制作U盘系统的软件,随便哪个都行,把U盘变成系统盘 2.下载镜像,将镜像copy到系统盘内即可(无需解压) 3.进入BIOS系统,将boot进行设置,将U盘设置为第 ...

  2. OC内存管理-黄金法则

    1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...

  3. 验证 Xcode是否有效方法

    苹果给出了验证 Xcode 的方法,需要用户在终端中执行下面的命令: spctl --assess --verbose /Applications/Xcode.app 如果 Xcode 从 Mac A ...

  4. Queue<T>队列与Stack<T>堆栈

    一.概述: Queue<T>队列,对象的先进先出集合("FIFO").Stack<T>栈,对象的后进先出集合("LIFO"). Queu ...

  5. iOS NSRunloop的简单理解

    最近学习了下NSRunloop. 作一下简单的理解: 1.runloop与线程的关系,每一个线程创建是都会有伴有一个runloop诞生,runloop用来接收事件源,让线程执行事件.当没有事件处理时, ...

  6. Python定制类(进阶6)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411919.html 本文出自:[Edwin博客园] Python定制类(进阶6) 1. python中什么 ...

  7. window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)

    linux下基本没什么问题,但在window操作系统下比较麻烦. 需要添加环境变量path路径:C:\Program Files (x86)\PostgreSQL\9.3\bin 添加postgres ...

  8. programming-languages学习笔记--第7部分

    programming-languages学习笔记–第7部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...

  9. QTP基本方法3-----截屏

    1.桌面截屏 Desktop.captureBitMap  path[,bolean] path:保存路径,可选择绝对路径或相对路径 相对路径是保存在脚本保存的目录下编号最大的res目录下. bole ...

  10. JQ中$(window).load和$(document).ready区别与执行顺序

    JQ中的$(document).ready()大家应该用的非常多,等同于$(function(){}),基本每个JS脚本中都有这个函数的出现有时甚至会出现多个,那么另一个加载函数$(window).l ...