SQL记录-PLSQL异常
PL/SQL异常
程序执行过程中出现错误情况被称为在PL/SQL异常。 PL/SQL支持程序员在程序中使用异常块捕获这样的条件并采取适当的动作应对错误情况。有两种类型的异常:
系统定义的异常
用户定义的异常
异常处理语法
一般异常处理的语法如下。在这里可以列出下来很多,要处理异常。默认的异常将使用WHEN others THEN处理:
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
示例
写一些简单的代码来说明这个概念。将使用我们已经创建,并在前面的章节中使用的CUSTOMERS表:
DECLARE
c_id customers.id%type := 8;
c_name customers.name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
No such customer! PL/SQL procedure successfully completed.
上述程序显示一个客户的ID给出的名字和地址。由于在我们的数据库没有ID值为8的客户,该程序运行时引发一个异常NO_DATA_FOUND,这是捕获异常EXCEPTION块。
引发异常
异常是数据库服务器自动在内部数据库错误,但异常可以明确地提出由程序员使用命令RAISE。以下是引发异常的简单的语法:
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
可以在引发Oracle的标准异常或任何用户定义的异常使用上述语法。下一节会显示如何引发用户定义异常,引发Oracle标准异常以及类似的方法的例子。
用户自定义异常
PL/SQL允许根据程序的需要定义自己的异常。用户定义的异常必须声明,然后明确地提出使用一个RAISE语句或程序DBMS_STANDARD.RAISE_APPLICATION_ERROR。
声明一个异常的语法是:
DECLARE
my-exception EXCEPTION;
示例:
下面的例子说明了这个概念。该程序需要一个客户ID,当用户输入了一个无效的ID,异常invalid_id引发。
DECLARE
c_id customers.id%type := &cc_id;
c_name customers.name%type;
c_addr customers.address%type; -- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
当上述代码在SQL提示符执行时,它产生了以下结果:
Enter value for cc_id: -6 (let's enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero! PL/SQL procedure successfully completed.
预定义异常
PL/SQL提供许多预先定义的异常,这是在被执行时的任何数据库规则由程序引发。例如,预定义异常NO_DATA_FOUND时引发一个SELECT INTO语句返回数据行。下表列出了一些重要的预先定义的异常:
| Exception | Oracle Error | SQLCODE | 描述 |
|---|---|---|---|
| ACCESS_INTO_NULL | 06530 | -6530 | 当一个空对象会自动分配一个值引发此异常 |
| CASE_NOT_FOUND | 06592 | -6592 | 当没有任何选择,在当选择一个CASE语句的子句,并且没有ELSE子句时被引发 |
| COLLECTION_IS_NULL | 06531 | -6531 | 当程序试图申请其他收集方法不是存在未初始化的嵌套表或VARRAY,或程序试图值分配给未初始化的嵌套表或变长数组的元素时被引发 |
| DUP_VAL_ON_INDEX | 00001 | -1 | 当重复值试图被存储在具有唯一索引的列时被引发 |
| INVALID_CURSOR | 01001 | -1001 | 当尝试以使这是不允许的,如关闭一个未打开的游标的游标操作时被引发 |
| INVALID_NUMBER | 01722 | -1722 | 当一个字符的字符串转换成一个数失败,因为字符串不表示一个有效的数据被引发 |
| LOGIN_DENIED | 01017 | -1017 | 当程序试图登录到数据库使用无效的用户名或密码被引发 |
| NO_DATA_FOUND | 01403 | +100 | 它被引发当一个SELECT INTO语句无任何行返回 |
| NOT_LOGGED_ON | 01012 | -1012 | 在不连接到数据库发出数据库调用它被引发 |
| PROGRAM_ERROR | 06501 | -6501 | 它被引发当PL/SQL有一个内部问题 |
| ROWTYPE_MISMATCH | 06504 | -6504 | 当游标取值有不兼容的数据类型的变量被引发 |
| SELF_IS_NULL | 30625 | -30625 | 它被引发,当对象的成员方法被调用,但对象类型的实例没有被初始化。 |
| STORAGE_ERROR | 06500 | -6500 | 它被引发当PL/SQL内存不足或内存已损坏 |
| TOO_MANY_ROWS | 01422 | -1422 | 它被引发当SELECT INTO语句返回多行 |
| VALUE_ERROR | 06502 | -6502 | 当算术,转换,截短,或大小约束错误时引发 |
| ZERO_DIVIDE | 01476 | 1476 | 它被引发当一个数试图除以零。 |
SQL记录-PLSQL异常的更多相关文章
- SQL记录-PLSQL记录
PL/SQL记录 PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...
- SQL记录-PLSQL基本语法与数据类型
PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...
- SQL记录-PLSQL包
PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- SQL记录-PLSQL过程
PL/SQL过程 子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...
- SQL记录-PLSQL循环
PL/SQL循环 可能有一种情况,当需要执行的代码块的几个多次.在一般情况下,语句顺序执行:一个函数的第一条语句,首先执行,然后是第二个...等等. 编程语言提供了各种控制结构,允许更多复杂的执行 ...
- SQL记录-PLSQL条件控制
PL/SQL条件控制 决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...
- SQL记录-PLSQL变量与常量文字
PL/SQL变量 变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...
- SQL记录-PLSQL集合
PL/SQL集合 集合是一个有序组具有相同的数据类型的元素.每个元素进行标识的唯一标表示其在集合中的位置. PL/SQL提供了三种集合类型: 索引表或关联数组 嵌套表 可变大小的数组或变长数组 Ora ...
随机推荐
- PowerBI开发 第十三篇:增量刷新
PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...
- Visual Studio Package 插件开发(Visual Studio SDK)
背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包“不亦乐乎”...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一个,干嘛不用持续集成 ...
- REST-framework快速构建API--频率
前面已经了解了API的认证和授权.认证,是对资源访问者的第一道门,必须有钥匙,你才能进来拿我的资源:授权,是对资源访问者的第二道门,虽然你进来了,但是你可以拿走什么资源,还是我说了算,就是授权. 当然 ...
- Selenium+Python自动化测试环境搭建和搭建过程遇到的问题解决
环境搭建: 第一步:安装Python 网址:https://www.python.org/ 按照如图提示安装,并且配置环境变量(安装时候选中pip会自动安装Python的包管理工具 pip,推荐选择 ...
- [环境配置]Ubuntu 16.04 源码编译安装OpenCV-3.2.0+OpenCV_contrib-3.2.0及产生的问题
1.OpenCV-3.2.0+OpenCV_contrib-3.2.0编译安装过程 1)下载官方要求的依赖包 GCC 4.4.x or later CMake 2.6 or higher Git GT ...
- ffmpeg sox 音频转换 MP3 转 wav
转自:https://blog.csdn.net/xiaoshulf/article/details/78657172 1 windows 下 mp3 文件和 wav 文件的 转换 实现代码: 1 f ...
- fabric-sdk-container v1.0-beta 新增支持多服务节点
HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...
- PAT甲题题解-1028. List Sorting (25)-水排序
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题
题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...
- Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较
说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...