Oracle中PL/SQL的执行部分和异常部分
一.PL/SQL的执行部分。
- 赋值语句。
赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值;另一种是通过SQL查询结果赋值。
用户赋值举例:
set serveroutput on; accept abc prompt ‘请输入abc的值‘; DECLARE a int:= &abc; BEGIN dbms_output.put_line(a); END;
查询赋值举例:
set serveroutput on; DECLARE str varchar2(20); BEGIN select ename into str from emp where empno=‘7369‘; dbms_output.put_line(str); END;
- 流程控制语句。
PL/SQL的主要控制语句如下:
1.if...then elsif … then end if;
判断if正确则执行then,否则执行else(elsif为嵌套判断)
注意elsif,里面少一下e.
2.Case var when … then when … then end
有逻辑的从数值中做出选择
3.Loop exit end loop
循环控制,用判断语句执行exit
4.Loop exit when … end loop
同上,当when为真时执行exit
5.while..loop end loop
当while为真时循环
6.for...in...loop end loop
已知循环次数的循环
因为流程控制比较多,在这里就不一一举实例了,写几个比较经典的程序给大家看一下。
********打印9*9乘法表*********
for in..loop
set serveroutput on; DECLARE i number; j number; BEGIN for i in 1..9 loop for j in 1..i loop dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘ ‘); end loop; dbms_output.put_line(‘‘); end loop; END;
while loop
set serveroutput on; declare i number:=1; j number:=1; begin while i<10 loop while j<=i loop dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘ ‘); j:=j+1; end loop; i:=i+1; j:=1; dbms_output.put_line(‘‘); end loop; end;
*********计算1+2+..+10的值*********
loop exit & loop exit when
set serveroutput on; declare i number:=1; i_sum number:=0; begin loop i_sum:=i_sum+i; i:=i+1; if i>10 then exit; end if; end loop; dbms_output.put(i_sum); dbms_output.put_line(‘‘); end;
注意:put只是把输出结果放入缓冲区,直到遇到put_line时才会输出。所以只有put的时候,不会显示i_sum的结果。
可以把 if i>10 then exit; end if; 换成exit when i>10;这样就成为了loop ..exit when .. end loop 结构。
*********输入一个字符,判断是字母、数字还是其他字符****************
if then elsif else
set serveroutput on; declare i_char varchar2(2); begin i_char:=&abc; if regexp_like(i_char,‘^[a-z]$‘) then dbms_output.put_line(‘输入的是字母‘); elsif regexp_like(i_char,‘^[0-9]$‘) then dbms_output.put_line(‘输入的是数字‘); else dbms_output.put_line(‘输入的是其他字符‘); end if; end;
case when
set serveroutput on; declare i_char varchar2(2); i_result varchar2(30); begin i_char:=&abc; i_result:= case when regexp_like(i_char,‘^[a-z]$‘) then ‘输入的是字母‘ when regexp_like(i_char,‘^[0-9]$‘) then ‘输入的是数字‘ else ‘输入的是其他字符‘ end; dbms_output.put_line(i_result); end;
注意:在提示窗口中输入的时候,字符串一定要加单引号,否则就会出错,本人每次在这里都要拌一下。
- SQL语句
SQL语句就是数据库查询语句,比较简单就不在这里说了。
- 游标语句
二.异常部分。
数据库中的异常跟java中的异常的机制和作用原理是一样的,只是代码和格式不一样,数据库中的异常分为三类:系统异常(预定义异常)、自定义异常以及引发应用程序异常。
- 系统异常
PL/SQL程序在运行过程中,可能会出现错误或异常现象
例如:无法建立到Oracle的连接或用0做除数。好的程序应该对可能发生的异常情况进行处理,异常处理代码在EXCEPTION块中实现
可以使用WHEN语句来定义异常。WHEN语句的使用方法如下:
EXCEPTION
WHEN <异常情况名> THEN
<异常处理代码>
WHEN <异常情况名> THEN
<异常处理代码>
...
WHEN OTHERS THEN
<异常处理代码>
常见的系统异常
异常名称 | 异常码 | 说明 |
NO_DATA_FOUND | ORA-01403 | select into语句中没有返回任何记录 |
TOO_MANY_ROWS | ORA-01422 | select into语句中返回多行数据。 |
ZERO_DIVDE | ORA-01476 | 试图用0作为除数。 |
DUP_VAL_ON_INDEX | ORA-00001 | 试图向唯一索引列插入重复值 |
INVALID_CURSOR | ORA-01001 | 试图进行非法游标操作。 |
CURSOR_ALREADY_OPEN | ORA-06511 | 试图打开一个已经打开的游标。 |
INVALID_NUMBER | ORA-01722 | 试图将数字转换为字符串。 |
VALUE_ERROR |
在产生大小限制错误时出现。如,变量中的列值超出变量的大小 |
|
LOGIN_DENIED |
输入的用户名或者密码无效时出现。 |
- 自定义异常
当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常情况的处理,步骤如下:
在PL/SQL 块的定义部分定义异常情况:
<异常名称> exception;
在PL/SQL 块的执行部分RAISE异常:
RAISE <异常名称>;
在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
WHEN <异常名称> THEN
代码...
- 引发应用程序异常