`

oracle处理例外

阅读更多
/*
预定义例外
*/
declare
  v_ename emp.ename%type;
begin
  select ename into v_ename from  emp where empno=&no;
  dbms_output.put_line('雇员名:'||v_ename);
  exception
   when TOO_MANY_ROWS THEN
dbms_output.put_line('查询只能返回单行');
   when NO_DATA_FOUND then
dbms_output.put_line('雇员号不正确');
end;

--ACCESS_INTO_NULL

create type emp_type as object
  (name varchar2(10),sal number(6,2));
 
GO

declare
   emp emp_type;
begin
   emp.name:='scott';
   exception
     when access_into_null then
    dbms_output.put_line('首先初始化对象emp');
end;

--CASE_NOT_FOUND
undef no
declare
  v_sal emp.sal%type;
begin
  select sal into v_sal from emp where empno=&&no;
  dbms_output.put_line('v_sal=='||v_sal);
case
  when v_sal<1000 then
    dbms_output.put_line('小于1000');
  when v_sal<2000 then
     dbms_output.put_line('小于2000');
  when v_sal<3000 then
    dbms_output.put_line('小于3000');
end case;
  exception
  when case_not_found then
   dbms_output.put_line('在Case语句中缺少与'||v_sal||'相关的事件');

end;

--COLLECTION_IS_NULL
declare
type ename_table_type is table of emp.ename%type;
ename_table ename_table_type;
begin
  select ename into ename_table(2) from emp where empno=&no;
  dbms_output.put_line('雇员名:'||ename_table(2));
  exception
    when collection_is_null then
     dbms_output.put_line('必须使用构造方法初始化集合元素');
end;
--CURSOR_ALREADY_OPEN
declare
cursor emp_cursor is select * from emp;
begin
  open emp_cursor;
  for emp_record in emp_cursor loop
    dbms_output.put_line('雇员:'||emp_record .ename);
  end loop;
  exception
    when cursor_already_open then
    dbms_output.put_line('游标已打开');
end;

--DUM_VAL_ON_INDEX
begin
  update dept set deptno=&new_no where deptno=&old_no;
exception
  when dup_val_on_index then
      dbms_output.put_line('在deptno上不能出现重复值');
end;

--INVALID_CURSOR
declare
cursor emp_cursor is select * from emp;
emp_record emp_cursor%rowtype;
begin
fetch emp_cursor into emp_record;
exception
when invalid_cursor then
dbms_output.put_line('请检查游标是否已经打开');
end;

--INVALID_NUMBER
begin
update emp set sal=sal+'1b';
exception
when invalid_number then
dbms_output.put_line('输入的数字不正确');
end;

--NO_DATA_FOUND
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where lower(ename)=lower('&name');
exception
when no_data_found then
dbms_output.put_line('不存在该雇员');
end;
--TOO_MANY_ROWS
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp where sal>2000;
exception
when too_many_rows then
dbms_output.put_line('返回多行,需用集合变量');
end;
--ZERO_DIVIDE
declare
num1 int:=100;
num2 int:=0;
num3 number(6,2);
begin
num3:=num1/num2;
exception
when zero_divide then
dbms_output.put_line('分母不能为零');
end;
--SUBSCRIPT_BEYOND_COUNT
declare
type emp_array_type is varray(20) of varchar2(10);
emp_array emp_array_type;
begin
emp_array:=emp_array_type('scott','marry');
dbms_output.put_line(emp_array(3));
exception
  when subscript_beyond_count then
    dbms_output.put_line('超出下标范围');
end;

--SUBSCRIPT_OUTSIDE_LIMIT
declare
type emp_array_type is varray(20) of varchar2(10);
emp_array emp_array_type;
begin
emp_array:=emp_array_type('scott','marry');
dbms_output.put_line(emp_array(-1));
exception
  when subscript_outside_limit then
  dbms_output.put_line('下标不能为负');
end;
--VALUE_ERROR
declare
v_ename varchar2(2);
begin
select ename into v_ename from emp where empno=&&no;
dbms_output.put_line(v_ename);
exception
  when value_error then
   dbms_output.put_line('变量尺寸不足');
end;
/*
非预定义例外
*/
--
  declare
  e_integrity exception;
  pragma exception_init(e_integrity,-2291);

begin
  update emp set deptno=&detpno where empno=&empno;
  exception
    when e_integrity then
    dbms_output.put_line('该部门不存在');
end;
/*
自定义例外
*/

  declare
  e_integrity exception;
  pragma exception_init(e_integrity,-2291);
  e_no_employee exception;
begin
  update emp set deptno=&detpno where empno=&empno;
  if sql%notfound then
    raise e_no_employee;
  end if;
  exception
    when e_integrity then
    dbms_output.put_line('该部门不存在');
    when e_no_employee then
     dbms_output.put_line('该雇员不存在');
end;
/**
例外函数
*/
-- SQLCODE,SQLERRM
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp where sal=&&v_sal;
dbms_output.put_line('雇员:'+v_ename);
exception
  when no_data_found then
   dbms_output.put_line('不存在工资为'||&v_sal||'的雇员');
  when others then
    dbms_output.put_line('错误号:'||sqlcode);
    dbms_output.put_line(sqlerrm);
end;
--RAISE_APPLICATION_ERROR

create or replace procedure raise_comm
(eno number,commission number)
is
v_comm emp.comm%type;
begin
select comm into v_comm from emp where empno=eno;
if v_comm is null then
raise_application_error(-20001,'该雇员无补助');
   end if;
exception
when no_data_found then
dbms_output.put_line('该雇员不存在');
end;

/*
编译警告
*/
create or replace procedure dead_code as
  x number:=10;
begin
   if x=10 then
x:=20;
   else
x:=100;--(死代码,永远不执行)
   end if;
end  dead_code ;

alter session set plsql_warnings='enable:informational';
alter procedure dead_code compile;

show errors;











分享到:
评论

相关推荐

    16oracle的例外处理 PPT

    以下是对“16Oracle的例外处理”中涉及的一些关键概念和用法的详细解释: 1. **异常(Exception)**:在Oracle中,异常是程序执行期间发生的非正常事件,比如SQL错误、逻辑错误或资源问题。异常可以通过异常处理...

    oracle例外处理

    ### Oracle异常处理详解 在Oracle数据库的PL/SQL编程中,异常处理是非常重要的一个环节,它可以帮助我们更好地控制程序流程,提高程序的健壮性和稳定性。本文将详细解析Oracle PL/SQL中的各种异常类型及其应用场景...

    Oracle例外用法实例详解

    下面通过一个小案例演示如果不处理例外看会出现什么情况? 编写一个存储过程,可接收雇员的编号,并显示该雇员的姓名。 sql代码如下: SET SERVEROUTPUT ON; DECLARE V_ENAME EMP.ENAME%TYPE; BEGIN SELECT ENAME...

    Oracle RAC配置ST_Geometry技术文档

    3. 修改每个节点下的 tnsnames.ora 文件,添加 Oracle 例外进程监听,红色部分要和 listener.ora 文件保持一致,只能保留一个 EXTPROC_CONNECTION_DATA: EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_...

    ORACLE PL_SQL中的例外处理初探 (1).pdf

    总的来说,Oracle PL/SQL的异常处理机制是提高代码质量和健壮性的关键工具,它使得开发者能够优雅地处理错误,确保程序在异常情况下的稳定运行。通过熟练掌握异常处理,开发者可以编写出更可靠、更易维护的数据库...

    韩顺平玩转oracle视频的文档

    - **处理预定义例外**:处理Oracle预先定义好的异常。 - **非预定义例外**:自定义异常的处理。 ### Oracle的视图 这部分介绍了Oracle中的视图概念及其使用方法。 通过以上内容,可以了解到Oracle数据库的强大功能...

    Oracle教程,java调用oracle

    10. **例外**:异常处理是处理运行时错误的关键部分。Oracle提供了BEGIN...EXCEPTION END结构来捕获和处理错误,确保程序的健壮性。 11. **Java调用存储过程和存储函数**:Java开发者可以使用JDBC(Java Database ...

    Oracle 10g 系统管理员简明教程目录

    Oracle 10g 系统管理员简明教程目录 本教程目录涵盖了 Oracle 10g 系统管理员需要掌握的知识点,包括 Oracle 10g...* 异常处理:包括预定义的例外处理、用 EXCEPTION INIT 产生例外、用户定义的例外处理等方面的介绍。

    java连接oracle实例

    首先,Java通过JDBC API与各种数据库进行交互,Oracle也不例外。JDBC是Java标准的一部分,它提供了一套API,使得Java程序可以连接到数据库,执行SQL语句,处理结果集等。要连接到Oracle数据库,我们需要以下步骤: ...

    oracle笔记(韩顺平oracle视频教学整理)

    19. 例外处理:讲述了在PL/SQL程序中如何处理异常情况,以确保程序的健壮性。 20. Oracle的视图:介绍了视图的概念和作用,以及视图与其它数据库系统(如MySQL、SQL Server)的比较。 21. Oracle认证:文档提到了...

    Oracle PLSQL语法大全及实例讲解.pdf

    8. **例外处理**: - `EXCEPTION`部分用于捕获和处理运行时错误。例如,如果在尝试插入时发生唯一键冲突,可以捕获并处理`ORA-00001`异常: ```sql DECLARE v_msg VARCHAR2(100); BEGIN INSERT INTO t_table ...

    oracle存储过程使用文档

    ### Oracle存储过程使用知识点 #### 一、存储过程概述 - **定义**:存储过程(Stored ...存储过程不仅可以帮助我们提高数据库操作的效率,还能简化复杂的业务逻辑处理,是Oracle数据库开发者不可或缺的一部分。

    2011年度oracle数据库技术大会演讲PPT全集PDF

    2011年度的Oracle数据库技术大会也不例外,通过这些演讲PPT,我们可以深入了解当年Oracle数据库的关键发展和创新。 首先,Oracle数据库的核心特性之一是其强大的数据存储和管理能力。在2011年的大会上,可能涵盖了...

    Oracle 中的视图详解.pdf

    当这些对象发生变化时,Oracle会自动处理视图的依赖关系。例如,如果删除了一个视图的基表,然后重建该表,Oracle会检查新建的表是否符合视图定义的要求,并评估视图的有效性。 #### 可更新连接视图 连接视图是指...

    Oracle-EBS开发笔记

    通过PL/SQL,可以与数据库交互,处理复杂的业务规则。 4. **Forms and Reports开发** Oracle Forms用于创建用户界面,而Oracle Reports则负责生成报表。开发者需要熟悉这两者的语法和设计原则,以构建高效、用户...

    Oracle库存管理培训资料.pptx

    3. **日历管理**:组织日历用于设定工作时间,包括季度类型、工作日模式、例外和班次。这些设定有助于管理库存交易的时间安排,如接收、发货和处理的时间窗口。 4. **位置信息**:组织位置包含公司的地址和联系信息...

    Oracle数据库存储过程技术文档.doc

    2.4 例外处理 22 2.5 一个完整的PL/SQL实例 24 第三章 oracle存储过程讨论 25 3.1 函数(FUNCTION) 26 3.1.1 用户函数创建,编译,删除 26 3.1.2 参数传递 27 3.2 存储过程 28 3.3 包 29 3.3.1 创建包 30 3.3.2 ...

Global site tag (gtag.js) - Google Analytics