当前位置:  互联网>综合
本页文章导读:
    ▪Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR      抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。 2. 非预.........
    ▪防止TIMER发生timer aleard cancel 的异常的处理方法      主要是通过异常来处理,如果有异常,抓住,建立新的timerimport java.util.Timer; import java.util.TimerTask; public class TimerTest extends Object {       private Timer timer = new Timer();        .........
    ▪在不连接网线的情况下Windos与VM之间如何ping通      一般情况下,如果宿主主机的网口连接网线并且能够上网,那么按照VM的默认安装,在VM-Settings-Hardware-Network Adapter-Network connection中选择Bridged连接方式,同时注意关闭window下的防火墙,那么windo.........

[1]Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
    来源: 互联网  发布时间: 2013-10-25
抛出异常 Oracle有三种类型的异常错误:

1. 预定义(Predefined)异常

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

2. 非预定义(Predefined)异常

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

3. 用户定义(User_define)异常

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


在PL/SQL中有三种方式抛出异常

  • 通过PL/SQL运行时引擎——抛出Oracle异常

  • 使用RAISE语句——抛出用户定义异常

  • 调用RAISE_APPLICATION_ERROR存储过程——抛出用户定义异常


非预定义异常

因为非预定义异常只有编号,没有名称,所以不能直接处理。

1、在PL/SQL 块的定义部分定义异常情况:

 <异常情况>  EXCEPTION; 

2、将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:

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

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO');

DECLARE
   v_deptno departments.department_id%TYPE := &deptno;
   deptno_remaining EXCEPTION;                     --1、定义异常
   PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); --2、关联
   -- -2292 是违反一致性约束的错误代码 
BEGIN
   DELETE FROM departments WHERE department_id = v_deptno;
EXCEPTION
   WHEN deptno_remaining THEN                      --3、处理
      DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;

用户自定义异常处理

用户定义的异常错误是通过显式使用 RAISE 语句来触发。

1、在PL/SQL 块的定义部分定义异常情况 ;

2、RAISE <异常情况>;

3、在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

DECLARE
   v_empno employees.employee_id%TYPE :=&empno;
   no_result  EXCEPTION;              --1、定义
BEGIN
   UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
   IF SQL%NOTFOUND THEN
      RAISE no_result;                --2、抛出
   END IF;
EXCEPTION
   WHEN no_result THEN                --3、处理
      DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;


RAISE_APPLICATION_ERROR

调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,将应用程序专有的错误从服务器端转达到客户端应用程序。它为应用程序提供了一种与ORACLE交互的方法。

语法如下:

     RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors] );

  • error_number 是从 –20,000 到 –20,999 之间的参数,这样就不会与 ORACLE 的任何错误代码发生冲突
  • error_message 是相应的提示信息(< 2048 字节),
  • keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。
  • There are two uses for RAISE_APPLICATION_ERROR.

    The first is to replace generic Oracle exception messages with our own, more meaningful messages.

    The second is to create exception conditions of our own, when Oracle would not throw them.

    create or replace procedure new_emp
        ( p_name in emp.ename%type
          , p_sal in emp.sal%type
          , p_job in emp.job%type
          , p_dept in emp.deptno%type
          , p_mgr in emp.mgr%type 
          , p_hired in emp.hiredate%type := sysdate )
    is
        invalid_manager exception;                     --1、定义
        PRAGMA EXCEPTION_INIT(invalid_manager, -2291); --2、关联
        dummy varchar2(1);
    begin
        if trunc(p_hired) > trunc(sysdate) 
        then
            raise_application_error
               (-20000, 'NEW_EMP::hiredate cannot be in the future'); --3、抛出自定义异常
        end if;
    
        insert into emp
            ( ename
              , sal
              , job
              , deptno
              , mgr 
              , hiredate )
        values      
            ( p_name
              , p_sal
              , p_job
              , p_dept
              , p_mgr 
              , trunc(p_hired) );
    exception
        when dup_val_on_index then
            raise_application_error
                (-20001, 'NEW_EMP::employee called '||p_name||' already exists', true); --3、包装Oracle异常
        when invalid_manager then
            raise_application_error
                (-20002, 'NEW_EMP::'||p_mgr ||' is not a valid manager'); --3、包装自定义异常
    
    end;
    /

    客户端调用时会提示详细异常信息:

    -- 测试RAISE_APPLICATION_ERROR自定义异常
    SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
    BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;
    
    *
    ERROR at line 1:
    ORA-20000: NEW_EMP::hiredate cannot be in the future --ORA-20000
    ORA-06512: at "APC.NEW_EMP", line 16
    ORA-06512: at line 1
    
    -- 测试RAISE_APPLICATION_ERROR包装自定义异常
    SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
    BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;
    
    *
    ERROR at line 1:
    ORA-20002: NEW_EMP::8888 is not a valid manager
    ORA-06512: at "APC.NEW_EMP", line 42
    ORA-06512: at line 1
    
    
    -- 测试RAISE_APPLICATION_ERROR包装Oracle异常
    SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
    BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;
    
    *
    ERROR at line 1:
    ORA-20001: NEW_EMP::employee called DUGGAN already exists
    ORA-06512: at "APC.NEW_EMP", line 37
    ORA-00001: unique constraint (APC.EMP_UK) violated --同时打印原始堆栈
    ORA-06512: at line 1









        
    [2]防止TIMER发生timer aleard cancel 的异常的处理方法
        来源: 互联网  发布时间: 2013-10-25
    主要是通过异常来处理,如果有异常,抓住,建立新的timerimport java.util.Timer;
    import java.util.TimerTask;
    public class TimerTest extends Object {       private Timer timer = new Timer();  
              //启动计时器  
              public void lanuchTimer(){  
                  timer.schedule(new TimerTask(){  
                      public void run() {  
                          System.out.println("aaa");
                          timer.cancel();
                          try{
                              addOneTask();
                          }catch(Exception e){
                              timer = new java.util.Timer();
                          }
                          
                      }  
                  }, 1000*3, 5);  
              }  
              //向计时器添加一个任务  
              public void addOneTask(){  
                  timer.schedule(new TimerTask(){  
                      public void run(){  
                          System.out.println("hello world");  
                          
                          
                      }  
                  }, 10,10*5);  
                  
              } 
                
              public static void main(String[] args) throws Exception {  
                  TimerTest test = new TimerTest();  
                  test.lanuchTimer();  
                 
                  Thread.sleep(1000*5);//5秒钟之后添加一个新任务  
                  test.addOneTask();  
    //              
                  
    //              test.timer.schedule(test.nn,1000*1,1000*5);
              }  
                     
              
              



     
    作者:yan470925731 发表于2013-6-18 10:26:29 原文链接
    阅读:78 评论:0 查看评论

        
    [3]在不连接网线的情况下Windos与VM之间如何ping通
        来源: 互联网  发布时间: 2013-10-25

    一般情况下,如果宿主主机的网口连接网线并且能够上网,那么按照VM的默认安装,在VM-Settings-Hardware-Network Adapter-Network connection中选择Bridged连接方式,同时注意关闭window下的防火墙,那么windows和VM直接很容易就ping通了,但当宿主主机的网口没有连接网络时,两者之间相互ping通就没有那么轻松了。笔者在一个项目中就正好遇到了这样的问题:

  • 宿主主机网口不能连接网线
  • 宿主主机上的windows系统和VM上的Ubuntu系统必须绑定IPv6地址
  • 下面来分析下问题,同时,提出解决问题的方法。

    VM的网络连接方式有Bridged、NAT、Host-only以及Custom,下面来具体看下前三个连接方式(最后这个笔者也还没搞明白)。

    • Bridged(网桥):网桥把虚拟机器连接到你的宿主机所在的局域网LAN上。这是让虚拟机访问宿主机所在网络的最容易的一种方式。这种情况下虚拟机需要自己独立的标识,比如TCP/IP网络中就需要自己的IP地址,这个IP地址从网络管理员处获得,还有其它的一些网络细节都需要手工设置。网桥方式下虚拟机跟宿主机一样是本地网络中的一个独立体,如同一个物理的机器一样。如果在vmware中同时运行多个虚拟机,那么每个虚拟机都应该有一个独立的IP地址。
    • NAT(网络地址转换NAT设备):如果宿主机所在网络不能给该虚拟机一个IP地址,那么NAT就是最容易的一种让虚拟机访问宿主机网络的方式。由于虚拟机没有外部物理网络的IP地址,因此vmware在宿主机上建立一个独立的私有网络,通过虚拟的DHCP服务器获得ip地址。NAT能够把多个虚拟机的网络数据加以区分并在虚拟机与外部物理网络之间进行传送。NAT方式下许多标准的TCP/IP协议都可以在虚拟机上使用,比如 HTTP/FTP/TELET等。但是默认情况下外部网络上的计算机不能连接到虚拟机上,因此虚拟机不能提供诸如WEB浏览这样的服务。
    • Host-only(宿主机虚拟网络适配器):该模式允许虚拟机与宿主机通信,但是这个虚拟适配器不会连接到任何外部的网络,只有在宿主机上建立起特殊的软件诸如代理服务器才能把虚拟适配器和物理适配器连接起来。实际上虚拟机只和宿主机进行网络连接。
    除此之外,还要说明,在vmware软件安装时根据需要会自动安装交换机组件。跟真实的交换机一样,它允许把多个网络组件连接起来,最多允许挂接9个交换机,名称分别为VMnet0-8。其中有3个已经默认分配给网桥(VMnet0),宿主机虚拟网络适配器(VMnet1)和网络地址转换NAT设备(VMnet8)。

    VMnet0、VMnet1、VMnet8在windows下是可以看到的,但当宿主主机拔出网线时,VMnet0就会自动消失,变得无效。这也就是为什么当宿主主机不连接网线时,选择Bridged模式,windows与VM之间无法ping通。

    到这里解决的办法也就很清楚了:

  • 选择NAT模式,VM对windows选择ping操作时选择VMnet8的IP地址。
  • 选择Host-only模式,VM对windows选择ping操作时选择VMnet1的IP地址。
  • 最后提示一点:在VM端的Ubuntu绑定IP时,最好IPv4和IPv6的地址全要绑定,即便只需要IPv6,因为只绑定IPv6的IP地址,最后网络连接时,指定的网卡可能绑定不上。


    参考资料:

    http://blog.chinaunix.net/uid-23601235-id-2395290.html

    作者:eddy_liu 发表于2013-6-18 17:23:18 原文链接
    阅读:41 评论:0 查看评论

        
    最新技术文章:
    ▪用户及权限基础 2---- Linux权限    ▪用户及权限基础 3---- Linux扩展权限    ▪git 简明教程(1) --创建及提交
    ▪背包 代码    ▪json对象的封装与解析    ▪01背包,完全背包,多重背包 ,模板代码
    ▪apache安装详解    ▪HDU 4668 Finding string (解析字符串 + KMP)    ▪《TCP-IP详解 卷1:协议》学习笔记(二)
    ▪《TCP-IP详解 卷1:协议》学习笔记(持续更新...    ▪windows下使用swig    ▪gensim试用
    ▪Linux Shell脚本编程--nc命令使用详解    ▪solr对跨服务器表联合查询的配置    ▪递归和非递归实现链表反转
    ▪Linux磁盘及文件系统管理 1---- 磁盘基本概念    ▪Cholesky Decomposition    ▪HTTP协议学习
    ▪用C语言写CGI入门教程    ▪用hdfs存储海量的视频数据的设计思路    ▪java多线程下载的实现示例
    ▪【原创】eAccelerator 一个锁bug问题跟踪    ▪hadoop学习之ZooKeeper    ▪使用cuzysdk web API 实现购物导航类网站
    ▪二维数组中的最长递减子序列    ▪内嵌W5100的网络模块WIZ812MJ--数据手册    ▪xss 跨站脚本攻击
    ▪RobotFramework+Selenium2环境搭建与入门实例    ▪什么是API    ▪用PersonalRank实现基于图的推荐算法
    ▪Logtype    ▪关于端口号你知道多少!    ▪Linux基本操作 1-----命令行BASH的基本操作
    ▪CI8.7--硬币组合问题    ▪Ruby on Rails 学习(五)    ▪如何使用W5300实现ADSL连接(二)
    ▪不允许启动新事务,因为有其他线程正在该会...    ▪getting start with storm 翻译 第六章 part-3    ▪递归求排列和组合(无重复和有重复)
    ▪工具类之二:RegexpUtils    ▪Coding Interview 8.2    ▪Coding Interview 8.5
    ▪素因子分解 Prime factorization    ▪C# DllImport的用法    ▪图的相关算法
    ▪二维数组中的最长递减子序列    ▪内嵌W5100的网络模块WIZ812MJ--数据手册    ▪xss 跨站脚本攻击 iis7站长之家
    ▪任意两点间的最短路径---floyd_warshall算法    ▪Sqoop实现关系型数据库到hive的数据传输    ▪FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream...
    ▪Ubuntu 13.04 – Install Jetty 9    ▪TCP/IP笔记之多播与广播    ▪keytool+tomcat配置HTTPS双向证书认证
    ▪安装phantomjs    ▪Page Redirect Speed Test    ▪windows media player 中播放pls的方法
    ▪sre_constants.error: unbalanced parenthesis    ▪http headers    ▪Google MapReduce中文版
    ▪The TCP three-way handshake (connect)/four wave (closed)    ▪网站反爬虫    ▪Log4j实现对Java日志的配置全攻略
    ▪Bit Map解析    ▪Notepad 快捷键 大全    ▪Eclipse 快捷键技巧 + 重构
    ▪win7 打开防火墙端口    ▪Linux Shell脚本入门--awk命令详解    ▪Linux Shell脚本入门--Uniq命令
    ▪Linux(Android NDK)如何避免僵死进程    ▪http Content-Type一览表    ▪Redis实战之征服 Redis + Jedis + Spring (二)
    ▪Tomcat7.0.40 基于DataSourceRealm的和JDBCRealm的资源...    ▪利用SQOOP将ORACLE到HDFS    ▪django输出 hello world
    ▪python re    ▪unity3D与网页的交互    ▪内存共享基本演示
    ▪python join    ▪不再为无限级树结构烦恼,且看此篇    ▪python实现变参
    ▪打开文件数限制功能不断地制造问题    ▪Arduino Due, Maple and Teensy3.0 的 W5200性能测试    ▪Selenium实例----12306网站测试
    ▪基于协同过滤的推荐引擎    ▪C4.5决策树    ▪C#HTTP代理的实现之注册表实现
    ▪nosql和关系型数据库比较?    ▪如何快速比较这两个字符串是否相等?    ▪hdoj 1863 畅通工程 最小生成树---prime算法
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3