IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Oracle异常处理语法与实例 -> 正文阅读

[大数据]Oracle异常处理语法与实例

0 总结

oracle异常总结

  • Oracle内部异常统一在《Database Error Messages》中,例如ORA-00910等等,其中-00910就是SQLCODE。
  • Oracle内部异常有系统内部识别抛出,在Catch时只能使用Other关键字接受(… when others …)。
  • 预定义异常将一些常用SQLCODE绑定名称,所以在Catch是可以使用名字接收(… when ZERO_DIVIDE …)。
  • 用户自定异常有两种使用方式:
    • 定义·xxx EXCEPTION;变量,然后直接raise xxx;,sqlcode永远为1。
    • 触发指定sqlcode的异常:3.2 与 3.3中介绍。sqlcode为定义值,范围:-20000到-20999

sqlcode总结

  • 内部异常、预定义异常(=内部异常号绑定名字),sqlcode通常为负数,只有"no data found"是100。
  • 用户定义异常
    • 直接定义使用的sqlcode永远为1。
    • 用RAISE_APPLICATION_ERROR的范围:-20000到-20999

1 Oracle内部异常

  • 不能用名字catch,必须间接使用EXCEPTION_INIT定义名字来catch
  • 预定义异常相当于给内部异常一个名字

1.1 实例

create table t12(info varchar(2));

BEGIN
  INSERT INTO t12 VALUES('11111111111');
EXCEPTION
  WHEN others THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- -12899
-- ORA-12899: value too large for column "SYS"."T12"."INFO" (actual: 11, maximum: 2)

1.2 取值范围

从文档中看

sqlcode可以使用范围:-00001-99999,五位负数。

实例:

...
ORA-12872: First slave parse gave different plan
ORA-12899: value too large for column string (actual: string, maximum: string)
ORA-12899: value too large for column string (actual: string, maximum: string)
ORA-12901: default temporary tablespace must be of TEMPORARY type
...

1.3 Raise与Catch方法

触发方式:

  • 系统系统触发,只能用others接收。
  • 用户自定义触发,可以用自定义标识符接受系统内部异常,注意SQLCODE必须为系统内部异常的CODE才能实现对应功能。
create table t12(info varchar(2));

DECLARE
  vvv EXCEPTION;
  PRAGMA EXCEPTION_INIT(vvv, -12899);
BEGIN
  INSERT INTO t12 VALUES('11111111111');
EXCEPTION
  WHEN vvv THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

2 Oracle预定义异常

  • 一共22个预定义异常

  • 注意所有预定义异常可以理解为Oracle内部异常加上STANDARD包中使用EXCEPTION_INIT定义了一些异常名,类似于1.3中的实例用法。

  • NO_DATA_FOUND 100是比较特殊的语法,唯一SQLCODE为正数的用法。

Exception NameError Code内部异常
ACCESS_INTO_NULL-6530ORA-06530: Reference to uninitialized composite
CASE_NOT_FOUND-6592ORA-06592: CASE not found while executing CASE statement
COLLECTION_IS_NULL-6531ORA-06531: Reference to uninitialized collection
CURSOR_ALREADY_OPEN-6511ORA-06511: PL/SQL: cursor already open
DUP_VAL_ON_INDEX-1ORA-00001: unique constraint (*string*.*string*) violated
INVALID_CURSOR-1001
INVALID_NUMBER-1722ORA-01722: invalid number
LOGIN_DENIED-1017
NO_DATA_FOUND+100特殊
NO_DATA_NEEDED-6548ORA-06548: no more rows needed
NOT_LOGGED_ON-1012
PROGRAM_ERROR-6501
ROWTYPE_MISMATCH-6504
SELF_IS_NULL-30625
STORAGE_ERROR-6500ORA-06500: PL/SQL: storage error
SUBSCRIPT_BEYOND_COUNT-6533
SUBSCRIPT_OUTSIDE_LIMIT-6532
SYS_INVALID_ROWID-1410
TIMEOUT_ON_RESOURCE-51
TOO_MANY_ROWS-1422ORA-01422: exact fetch returns more than requested number of rows
VALUE_ERROR-6502ORA-06502: PL/SQL: numeric or value error*string*
ZERO_DIVIDE-1476

内部异常与预定义异常等价实例

内部异常

DECLARE
  stock_price   NUMBER := 9.73;
  net_earnings  NUMBER := 0;
  pe_ratio      NUMBER;
BEGIN
  pe_ratio := stock_price / net_earnings;  -- raises ZERO_DIVIDE exception
  DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio);
EXCEPTION
  WHEN others THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- -1476
-- ORA-01476: divisor is equal to zero

预定义异常

DECLARE
  stock_price   NUMBER := 9.73;
  net_earnings  NUMBER := 0;
  pe_ratio      NUMBER;
BEGIN
  pe_ratio := stock_price / net_earnings;  -- raises ZERO_DIVIDE exception
  DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio);
EXCEPTION
  WHEN ZERO_DIVIDE THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- -1476
-- ORA-01476: divisor is equal to zero

3 用户定义异常

3.1 用户自定义异常:sqlcode=1

DECLARE
  xxx  EXCEPTION;
BEGIN
  raise xxx;
EXCEPTION
  WHEN xxx THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- 1
-- User-Defined Exception

3.2 others接收实例:sqlcode=-20222

sqlcode范围:-20000到-20999

BEGIN
  RAISE_APPLICATION_ERROR(-20222, 'raise my zero devide!');
EXCEPTION
  WHEN others THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- -20222
-- ORA-20222: raise my zero devide!

3.3 名字接收实例:sqlcode=-20222

sqlcode范围:-20000到-20999

DECLARE
  zzz EXCEPTION;
  PRAGMA EXCEPTION_INIT (zzz, -20222);
BEGIN
  RAISE_APPLICATION_ERROR(-20222, 'raise my zero devide!');
EXCEPTION
  WHEN zzz THEN
    dbms_output.put_line(sqlcode);
    dbms_output.put_line(sqlerrm);
END;
/

-- -20222
-- ORA-20222: raise my zero devide!
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:03:44  更:2022-09-24 21:04:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:04:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码