zoukankan      html  css  js  c++  java
  • PLSQL存储过程调用存储过程对异常的处理问题

    开始

    如果对异常处理不正确,有可能会导致意想不到的结果。下面这个就是:

    先写两个存储过程 test01 和  test02:

    CREATE OR REPLACE PROCEDURE test01 IS
    
    v_id emp.empno%TYPE;
    
    BEGIN
       UPDATE emp SET ename='test01' WHERE empno=7369;
    
       /*this will raise no_data_found exception*/
       SELECT empno INTO v_id FROM emp WHERE empno=12345; 
    END;
    
    CREATE OR REPLACE PROCEDURE test02 IS
    
    BEGIN
      UPDATE emp SET ename='test02' WHERE empno=7499;
      
      /*call another procedure*/
      test01;
      
    EXCEPTION
      
      WHEN NO_DATA_FOUND THEN
         DBMS_OUTPUT.PUT_LINE('execption occured.!');
      
    END;

    test02 调用 test01 ,由于 test01处理SQL文的时候,select 语句试图查找一条并不存在的记录,导致 NO_DATA_FOUND 发生。

    而这个异常实际上是发生在test01 内部,但是test01 没有处理这个异常的代码逻辑,所以就抛给了test02。

    然后,按照 oracle 文档的说法:

    test02 处理完此 NO_DATA_FOUND 异常后,因为异常已经处理完毕,所以test01的异常之前的代码并没有rollback,而是继续和 test02 中的语句一起参与运算,最终一起被提交。

    所以查询结果是:

    empno 为 7369 和 7499 的数据都被改变了!

    不过,目前这个结论还不太可靠,因为,单纯的异常并没使得SQL失效。比如下例:

    CREATE OR REPLACE PROCEDURE test03 IS
    
    v_id emp.empno%TYPE;
    
    BEGIN
       UPDATE emp SET ename='test03' WHERE empno=7369;
    
       /*this will raise no_data_found exception*/
       SELECT empno INTO v_id FROM emp WHERE empno=12345; 
     
    EXCEPTION
       WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('Exception Occured!');
    END;

    结束

  • 相关阅读:
    数组以字符串记录(字符串转数组)
    linux下OpenSSL的RSA密钥生成
    php rsa加密解密实例 及签名验证-自己实践
    php rsa加密解密实例
    PHP的openssl加密扩展使用小结
    支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对
    HTTP缓存控制
    java去任意范围的随机数
    (转)Eclipse4.2 Tomcat启动报错 A child container failed during start
    模态框事件介绍
  • 原文地址:https://www.cnblogs.com/gaojian/p/2784734.html
Copyright © 2011-2022 走看看