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的时候发生异常,直接执行异常处理语句,后面的语句都不再执行。