Oracle

1)Oracle在执行INSERT、DELETE、UPDATE以及SELECT语句的时候,其中更新删除都是先根据WHERE条件查找匹配的记录,然后返回受影响的行数。

  而SQL%FOUND、SQL%NOTFOUND【这两个用来检测之前的更新或删除是否有效很有用】可以检测最近一条语句返回受影响的结果。如下表  SELECT *  FROM  A

  

  执行如下语句,其中id为2的记录不存,但是程序并不会拋异常,ID为2返回结果0行数据被更新,才会执行IF条件中的语句

BEGIN 
          FOR I IN 1..5 LOOP
          UPDATE A T SET T.PASSWORD='ROOT' WHERE T.ID=I;
          IF SQL%NOTFOUND THEN
             DBMS_OUTPUT.PUT_LINE(I);
          END IF; 
          DBMS_OUTPUT.PUT_LINE('哈哈');
          END LOOP;
END;

  执行结果如下:

哈哈
2
哈哈
哈哈
哈哈
哈哈

 2)Oracle的预定义异常有

  NO_DATA_FOUND  SELECT ..INTO..时没有找到数据

  DUL_VAL_ON_INDEX 试图在一个有唯一约束的列上存储重复值

  CURSOR_ALREADY_OPEN 试图打开一个已经打开的的游标

  TOO_MANY_ROWS SELECT ..INTO..时查询到多个值

  ZERO_DIVIDE 零被整除

  OTHERS 其他异常

  如下面的代码。

DECLARE
   i NUMBER(20):=5;
   temp NUMBER(20);
   BEGIN 
          while i>= 0 loop
                TEMP := 5/i;
                DBMS_OUTPUT.PUT_LINE(i);
                i:= i-1;
          end loop;
          DBMS_OUTPUT.PUT_LINE('123');
          EXCEPTION
          WHEN ZERO_DIVIDE THEN
               DBMS_OUTPUT.PUT_LINE('0被整除!');
          WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE('发生了其他异常!');
         
   END;

   程序执行结果如下

5
4
3
2
1
0被整除!

 

分析:EXCEPTION捕获之前的所有语句,当循环到i=0的时候,执行 TEMP:=5/I的时候发生异常,直接执行异常处理语句,后面的语句都不再执行。

原文地址:https://www.cnblogs.com/zplogo/p/8405059.html