`
sd8089730
  • 浏览: 258769 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

PL/SQL(五)(函数-异常)

阅读更多
输入员工编号  得到 员工工作到现在的月数
  1   create or replace function v_emp(v_empno int) return int is
  2   v_month int;
  3   v_hiredate varchar2(20);
  4   begin
  5   select hiredate into v_hiredate from emp where empno=v_empno;
  6   v_month:=months_between(sysdate,v_hiredate);
  7   return v_month;
  8*  end v_emp;
SQL> /

函数已创建。

SQL> select v_emp(7369) from dual;

V_EMP(7369)
-----------
        355

 

创建一个函数  输入 两个值 然后得到 emp 表 第几行到第几行的内容

create or replace function v_emppage(v_first int,v_second int) return sys_refcursor is
v_rs sys_refcursor;
begin
open v_rs for select empno,ename,job,mgr,hiredate,sal,comm,deptno from (select rownum r ,emp.* from emp) where r between v_first and v_second;
return v_rs;
end;
/

运行——--------------------------------------------------------------------

 declare
 rs sys_refcursor;
 v_emp emp%rowtype;
 begin
 rs:=v_emppage(3,10);
 loop
 fetch rs into v_emp;
 exit when rs%notfound;
 dbms_output.put_line(v_emp.ename);
 end loop;
 close rs;
 end;
 /

 

输入两个字母 返回 分别包含或同时包含这两个字符的 员工信息

 create or replace function v_view(first varchar2,second varchar2) return sys_refcursor is
 v_rs sys_refcursor;
 begin
 open v_rs for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '%'||first||'%' or ename like '%'||second||'%';
 return v_rs;
 end;
 /
---------------------------------执行---------------------------------------------

 declare
 rs sys_refcursor;
 r_emp emp%rowtype;
 begin
 rs:=v_view('A','B');
 loop
 fetch rs into r_emp;
 exit when rs%notfound;
 dbms_output.put_line(r_emp.ename);
 end loop;
 close rs;
 end;

 

异常

Oracle提供了
1:预定义异常
用于处理常见的Oracle错误
2:非预定义异常
用于处理预定义异常所不能处理的Oracle错误
3:自定义异常
用于处理于Oracle错误无关的其他情况
异常处理部分是以关键字EXCEPTION开始的,语法如下:
  EXCEPTION
    WHEN  exception_Name THEN  --exception_Name为异常的名字
      statement1;
    WHEN OTHERS THEN
  statement1;
   


异常处理部分从关键字EXCEPTION开始,在异常处理部分使用WHEN字句捕捉各种异常,如果有其他未预定义到的异常,使用WHEN OTHERS THEN字句进行捕捉和处理。
1、 处理预定义异常,这是系统预定的21种类型
  错误代码是负整数,如-51
     

   
  Access_info_null(ora-06530)
     当访问没有初始化的对象时触发。
   
  Case_not_found(ora-06592)
     case过程中when后没有包含必要的条件分支并且没有else子句,则会触发本异常。
   
  Collection_is_null(06531)
     访问未初始化的集合元素(嵌套表或者varray)。
   
  Cursor_already_open(ora-06511)
     重新打开已经打开的游标。
   
  Dup_val_on_index(ora-00001)
     当中唯一索引所对应的列上键入重复值时。
   
  Invalid_cursor(ora-01001)
     试图在不合法的游标上执行操作时,譬如没打开游标就提取内容
   
  Invalid_number(ora-01722)
     当试图将非法的字符串转换为数字类型时。
   
  No_data_found(ora-01403)
     执行select into未返回行,或者引用了索引表未初始化的元素时。
   
  Too_many_rows(ora-01422)
     执行select into返回超过一行数据时。
   
  Zero_divide(ora-01476)
     0作为被除数时。
   
  Subscript_beyond_count(ora-06533)
     使用嵌套表或者varray集合时,如果引用下标超过last。
   
  Subscript_outside_limit(ora-06532)
     使用嵌套表或varray集合时,如果引用下标小于first。
   
  Value_error(ora-06502)
     在执行赋值操作时,如果变量长度不足以容纳实际数据。
   
  Login_denied(ora-01017)
     连接数据库时提供了不正确的用户名或口令。
   
  Not_logged_on(ora-01012)
     在程序没有连接到oracle数据库时执行plsql代码则会触发。
   
  Program_error(ora-06501)
     plsql内部问题。
   
  Rowtype_mismatch(ora-06504)
     执行赋值操作时,如果宿主游标变量和PLSQL游标变量返回类型不兼容时。
   
  Self_is_null(ora-30625)
     使用对象类型时,如果在null实例上调用成员方法。
   
  Storage_error(ora-06500)
     超出内存空间或者内存被损坏。
   
  Sys_invalid_rowid(ora-01410)
     无效字符串企图转换为rowid类型时。
   
  Timeout_on_resource(ora-00051)
     等待资源时出现超时错误 

 

处理自定义异常


预定义异常和非预定义异常都与Oracle错误有关,并且当出现Oracle错误时会隐含触发相应异常;
而自定义异常与Oracle错误没有任何关联,它是由开发人员为特定情况所定义的异常。


当使用自定义异常时,
一:需要在定义部分(DECLARE)定义异常,
二:再执行部分(BEGIN)触发异常(使用RAISE语句),
三:在异常处理部分(EXCEPTION)捕捉并处理异常。


  declare
   myexception exception;
  begin
  
if
1=0
then
  
raise myexception;
  
endif; 
  exception
  
when

myexception 
then
       dbms_output.put_line('asdf');
  end;
   
注意:不能在同一个block中描述EXCEPTION两次,但是可以描述一个exception在两个不同的block中。异常(exception)是有作用域的,子块的异常不能被当前块所捕捉,
Exception练习 (自定义)




 create or replace procedure v_div(a int,b int) is
 v_exception exception;
 begin
 if b=0 then
  raise v_exception;
 end if;
 dbms_output.put_line('结果:'||a/b);
 exception
 when v_exception then
  dbms_output.put_line('分母不能为零,谢谢');
 end v_div;

 

!处理非预定义异常


使用非预定义异常包括三步:
一:在定义部分定义异常名,
二:在异常和Oracle错误之间建立关联,
三:在异常处理部分捕捉并处理异常。
当定义Oracle错误和异常之间的关联关系时,需要使用伪过程EXCEPTION_INIT。
一:首先的定义部分定义异常;
二:使用progmaexception_init(exception_name,exception_number) 在异常和oracle错误之间建立关联,
    这时要求用户知道可能出现的错误号(异常函数sqlcode、sqlerrm和raise_application_error);
三:最终在异常处理部分捕捉并处理异常。
下面以更新特定雇员的部门号,并处理ORA-02291错误为例,说明使用非预定义异常的方法。示例如下:
  DECLARE
    e_integrity EXCEPTION;  --1、定义部分
    PRAGMA EXCEPTION_INIT (e_integrity, -2291);  --2、建立关联关系
  BEGIN
    UPDATE  emp SET deptno=  &dno WHERE  empno = &eno;
  EXCEPTION
    WHEN  e_integrity THEN  --3、捕捉处理
      DBMS_OUTPUT.PUT_LINE(‘该部门不存在’);
  END;

 

oracle预定义的异常列表
2008-10-30 16:06
命名的系统异常         产生原因 
ACCESS_INTO_NULL         未定义对象 
CASE_NOT_FOUND         CASE 中若未包含相应的 WHEN ,并且没有设置 ELSE 时 
COLLECTION_IS_NULL         集合元素未初始化 
CURSER_ALREADY_OPEN         游标已经打开 
DUP_VAL_ON_INDEX         唯一索引对应的列上有重复的值 
INVALID_CURSOR         在不合法的游标上进行操作 
INVALID_NUMBER         内嵌的 SQL 语句不能将字符转换为数字 
NO_DATA_FOUND         使用 select into 未返回行,或应用索引表未初始化的元素时 
TOO_MANY_ROWS         执行 select into 时,结果集超过一行 
ZERO_DIVIDE         除数为 0 
SUBSCRIPT_BEYOND_COUNT         元素下标超过嵌套表或 VARRAY 的最大值 
SUBSCRIPT_OUTSIDE_LIMIT         使用嵌套表或 VARRAY 时,将下标指定为负数 
VALUE_ERROR         赋值时,变量长度不足以容纳实际数据 
LOGIN_DENIED         PL/SQL 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码 
NOT_LOGGED_ON         PL/SQL 应用程序在没有连接 oralce 数据库的情况下访问数据 
PROGRAM_ERROR         PL/SQL 内部问题,可能需要重装数据字典& pl./SQL 系统包 
ROWTYPE_MISMATCH         宿主游标变量与 PL/SQL 游标变量的返回类型不兼容 
SELF_IS_NULL         使用对象类型时,在 null 对象上调用对象方法 
STORAGE_ERROR         运行 PL/SQL 时,超出内存空间 
SYS_INVALID_ID         无效的 ROWID 字符串 
TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时

=============================================================

BEGIN
《PL/SQL块》;
Exception
when no_data_found then --没有找到数据
《响应命令》;
when too_many_rows then --返回多行,隐式光标每次只能检索一行数据
《响应命令》;
when invalid_number then --字符向数字转换失败
《响应命令》;
when zero_divide then --被零除
《响应命令》;
when dup_val_on_index then --向唯一索引中插入重复数据
《响应命令》;
when invalid_cursor then --非法游标操作
《响应命令》;
when value_error then --数字的,数据转换,截字符串或强制性的错误
《响应命令》;
when others then --发生其它任何错误
null; --选择一:什么也不做,就当错误没发生
raise form_trigger_failure; --选择二:挂起当前程序
END;


常用预定义例外
EXCEPTION
WHEN CURSOR_ALREADY_OPEN THEN -- ORA-06511 SQLCODE = -6511 游标已经打开
..WHEN DUP_VAL_ON_INDEX THEN -- ORA-00001 SQLCODE = -1 向唯一索引中插入重复数据
..WHEN INVALID_CURSOR THEN -- ORA-01001 SQLCODE = -1001 非法游标操作
..WHEN INVALID_NUMBER THEN -- ORA-01722 SQLCODE = -1722 字符向数字转换失败
..WHEN LOGIN_DENIED THEN -- ORA-01017 SQLCODE = -1017 

..WHEN NO_DATA_FOUND THEN -- ORA-01403 SQLCODE = +100 没有找到数据
..WHEN NOT_LOGGED_ON THEN -- ORA-01012 SQLCODE = -1012 
..WHEN PROGRAM_ERROR THEN -- ORA-06501 SQLCODE = -6501 程序错误
..WHEN STORAGE_ERROR THEN -- ORA-06500 SQLCODE = -6500
..WHEN TIMEOUT_ON_RESOURCE THEN -- ORA-00051 SQLCODE = -51

..WHEN TOO_MANY_ROWS THEN -- ORA-01422 SQLCODE = -1422 返回多行
..WHEN TRANSACTION_BACKED_OUT THEN -- ORA-00061 SQLCODE = -61

..WHEN VALUE_ERROR THEN -- ORA-06502 SQLCODE = -6502 数值转换错误
..WHEN ZERO_DIVIDE THEN -- ORA-01476 SQLCODE = -1476 被零除
..WHEN OTHERS THEN -- 其它任何错误的处理
..END; 

 

分享到:
评论

相关推荐

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    1. **PL/SQL基础**:涵盖PL/SQL的基本语法,包括变量声明、常量定义、条件语句(IF-THEN-ELSIF-ELSE)、循环结构(WHILE, FOR)、异常处理(BEGIN-EXCEPTION-END)以及子程序(PROCEDURE和FUNCTION)的创建与调用。...

    Oracle PL/SQL实例精讲--使用表,课后答案

    - 理解并应用PL/SQL异常处理机制。 这些知识对于任何希望在Oracle数据库环境中进行开发或管理的人都至关重要。通过实际操作和解决课后练习,你可以将理论知识转化为实用技能,从而提升你在数据库管理和开发领域的...

    最容易上手的PL/SQL学习教程-有经过测试的丰富案例

    在§2.2中,我们看到了PL/SQL块可以是匿名块(直接在SQL*PLUS中执行的一次性代码块)或命名块(如存储过程、函数、包等)。 标识符(§2.3)是PL/SQL中的重要组成部分,它们用于命名变量、常量、表、过程等。在§...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 五、PL/SQL应用构建 - **事务处理**:讲解如何使用事务来确保数据的一致性和完整性,包括如何开始、提交和回滚事务。 - **安全性与权限管理**:介绍如何通过角色、用户和模式对象来实现安全访问控制。 - **...

    Oracle-PL/SQL-windows-32位-客户端

    Oracle PL/SQL是Oracle数据库与开发人员之间交互的重要工具,特别是在Windows 32位系统上。这个压缩包“Oracle-PL/SQL-windows-32位-客户端”包含了Oracle数据库32位客户端所需的组件,主要用于在Windows环境下进行...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

    Oracle PL SQL专家指南_高级PLSQL解决方案的设计与开发

    这些章节覆盖了从基础到高级的PL/SQL技术,包括数据处理、并发控制、异常处理、性能优化以及在分布式环境中的应用。通过学习,读者将能够设计和开发出高效、可靠的PL/SQL解决方案,提升在Oracle数据库系统中的编程...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    1. **编程能力**:PL/SQL允许编写包含控制结构(如循环、条件语句)和异常处理的程序块,这些块可以存储在数据库中并按需调用,提高了数据库应用的灵活性和复杂性。 2. **数据处理**:通过PL/SQL,用户可以直接对...

    pl/sql最新中文手册

    3. **异常处理**:在PL/SQL中,异常处理是通过EXCEPTION关键字实现的,用于捕获并处理运行时错误。手册会详细解释如何定义和使用预定义及自定义异常。 4. **数据库操作**:PL/SQL与Oracle数据库紧密集成,可以执行...

    PL/SQL 常用函数

    PL/SQL 常用函数 PL/SQL 中的函数可以分为两大类:单行函数和组函数。单行函数用于处理单行数据,可以在 SELECT、WHERE、ORDER BY 等子句中使用。今天我们将讨论单行函数的使用和规则。 1. 日期格式转换函数 TO_...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    PL/SQL 的函数与存储过程练习

    PL/SQL 的函数与存储过程练习 PL/SQL 的函数与存储过程练习

    pl/sql developer11.0

    PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,专为编写、调试、测试和管理PL/SQL代码而设计。标题中的“pl/sql developer11.0”指的是该软件的第11个主要版本。在本文中,我们...

    pl/sql 学习资料

    - PL/SQL结构:了解块的概念,包括声明部分、执行部分和异常处理部分。 - 数据类型:熟悉PL/SQL内置的数据类型,如NUMBER、VARCHAR2、DATE等。 - 变量和常量:声明和使用变量,以及定义常量。 - 控制流程语句:...

    PL/SQL安装包

    2. **集成性**:PL/SQL直接嵌入到Oracle数据库中,可以创建存储过程、函数、触发器等数据库对象,执行效率高,数据访问安全。 3. **事务处理**:PL/SQL支持ACID(原子性、一致性、隔离性和持久性)原则,允许开发者...

    PL/SQL 13.0 64位-亲测可用

    PL/SQL还支持异常处理,这使得开发者能够在出现错误时采取适当的措施,而不是让程序崩溃。通过使用BEGIN...EXCEPTION...END语句块,你可以捕获和处理特定类型的错误,提供更健壮的程序逻辑。 此外,PL/SQL提供了与...

    pl/sql学习笔记

    例如,PL/SQL有声明变量、异常处理和包(PACKAGE)的概念,这些都是T-SQL所不具备的。 3. **区块表示BEGIN…END;** 在PL/SQL中,代码块是通过BEGIN和END关键字定义的,用于组织代码。一个块可以包含声明、控制流...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    oracle 9i pl/sql程序设计笔记

    ### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...

Global site tag (gtag.js) - Google Analytics