PLSQL入门到精通(第6章:异常)

大家好我是牧无文兄。

前一次我们针对SELECT INTO做了简单的说明,本次针对他的异常处理进行解释。

我们用文本的方式进行编辑,保存到 TEST.sql文件中。
可以通过SQL*PLUSl来执行TEXT.SQL。(执行方法不在叙述)

▼▼▼ TEST.sql文件的内容▼▼
set serveroutput on
set verify off
DECLARE V_EMPNO EMP.EMPNO%TYPE :=&员工编号;
V_ENAME EMP.ENAME%TYPE;
V_DEPTNO DEPT.DEPTNO%TYPE;
V_DNAME DEPT.DNAME%TYPE;
BEGIN
/根据指定的员工编号获取员工名称和部门编号/
SELECT
ENAME,
DEPTNO
INTO
V_ENAME,
V_DEPTNO
FROM
EMP
WHERE
EMPNO = V_EMPNO;
/以该部门编号询问部门表,取得部门名称/
SELECT
DNAME
INTO
V_DNAME
FROM
DEPT
WHERE
DEPTNO = V_DEPTNO;
DBMS_OUTPUT.PUT_LINE(‘咨询公司职员的名字是’ || V ENAME || ‘。所属部门是’ || V DNPAME || ‘。’);
END;
/

▲▲▲▲到此结束▲▲▲▲

执行TEST.sql文件,因为代码里边有“&职员编号”,将其置换为指定字符串(以下示例中为“7934”)后发送给服务器。
结果显示了从服务器返回的员工的信息。
▼▼▼▼ TEST.sql的执行结果▼▼
SQL> @TEST
请在职员编号中输入值:7934 ←输入
咨询公司的职员名是MILLER。所属部门是ACCOUNTING。←输出
PL/SQL成功完成。

▲▲▲▲到此结束▲▲▲▲

程序解释如下:
该程序首先输入员工编号,传递给程序。
将员工名和部门号取到,通过SLECT INTO放到变量里边.
根据部门号取得部门名,最后画面显示该员工的职员名和所属部门名。

但是,这个程序有问题。
作为一个完整的程序,如果指定一个不存在的员工,SELECT INTO就没有记录没找出来。结果为0件。
程序就会发生错误。
譬如:

▼▼▼▼从这里开始▼▼▼▼
SQL> @TEST
请在员工编号中输入值:9999←不存在的员工编号
DECLARE * 第1行发生错误。:
ORA-01403:找不到数据。
ORA-06612:行8
▲▲▲▲到此结束▲▲▲▲

如果该程序是发布给用户的程序,从用户的角度来看,不知道错误的原因。
在这种情况下,希望显示“员工编号9999不存在”这样易懂的错误信息。

扫描二维码关注公众号,回复: 12643587 查看本文章

为此需要追加异常处理。

以下是设置了异常处理部的修正后的TEST.sql文件。
▼▼▼修改后的TEST.sql▼▼▼▼▼▼▼▼▼

set serveroutput on
set verify off
DECLARE
V_EMPNO EMP.EMPNO%TYPE :=&员工编号;
V_ENAME EMP.ENAME%TYPE;
V_DEPTNO DEPT.DEPTNO%TYPE;
V_DNAME DEPT.DNAME%TYPE;
BEGIN
/根据指定的员工编号获取员工名称和部门编号/
SELECT
ENAME,
DEPTNO
INTO
V_ENAME,
V_DEPTNO
FROM
EMP
WHERE
EMPNO = V_EMPNO;

/以该部门编号询问部门表,取得部门名称/
SELECT
DNAME
INTO
V_DNAME
FROM
DEPT
WHERE
DEPTNO = V_DEPTNO;
DBMS_OUTPUT.PUT_LINE(‘咨询公司职员的名字是’ || V ENAME || ‘。 所属部门是’ || V DNPAME || ‘。’);
/以下为追加的异常处理部/
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘员工编号’|| V EMPNO ||’不存在’);
END;
/

▲▲▲▲到此结束▲▲▲▲

执行结果如下:
▼▼▼▼从这里开始▼▼▼▼▼
SQL> @TEST
请在职员编号中输入值:9999
员工编号9999不存在
PL/SQL过程成功完成。

▲▲▲▲到此结束▲▲▲▲

这样,即使指定了不存在的职员编号,也可以输出通知信息,表示员工编号不存在,而不是错误。

要说修改前后有什么不同,那就是设置了异常处理(EXCEPTION以下的记述)。
没有异常处理部的情况下,执行部发生错误时,异常结束。
但是,如果有异常处理部的话,通过异常处理可以正常结束。
这次的错误是“找不到数据。”

但是,关于这个「ORIA-01403」错误,有「NO DATA FOUND」的名字。像这样错误的名字叫做异常名。

并不是所有的错误都有异常名,但是我们再编程的时候,经常都要用到错误的异常名。
这时候需要我们自己定义异常名,这个被称为事前定义异常。

异常处理部使用异常名称记述异常处理程序。

下面是常用的异常处理写法:

EXCEPTION
WHEN 异常名1 THEN ←异常处理程序1
处理1
WHEN 异常名2 THEN ←异常处理程序2
处理2
・・・・ OTHERS处理程序
其他处理
END;(←PL/SQL块的结束)

您可以看到多个异常处理程序。
书写顺序是任意的,发生错误时实际执行的异常处理程序只有一个。
执行异常处理程序后,PL/SQL块正常结束。

另外,最后可以记述为“WHEN OTHERS THEN”,这个部分叫做OTHERS处理程序。
OTHERS处理程序是在没有相应异常处理程序的情况下处理的异常处理程序。
例如,对于没有异常名的错误,可以通过OTHERS处理程序进行异常处理。
也可以给没有异常名的错误加上异常名。

关于非事前定义异常,我们其他时间进行说明。

另外,题外话,为了使这次的项目更具特色,关于上述plsql块是分别进行2个表的查询。
我们可以通过外连接的方式,写成一个SQL:

  SELECT
      E.ENAME , 
      D.DNAME 
  INTO 
      V_ENAME, 
      V_DNAME  
  FROM   
      EMP E,  
      DEPT D  
  WHERE  
      E.DEPTNO = D.DEPTNO  
      AND  E.EMPNO = V_EMPNO;

这样效率就提高很多。

但是,这也是一个简单的例子。实际开发过程中会有非常复杂的SELECT语句,也可以不用非要写成一个SELECT语句。

不管怎么说,PL/SQL块无论是无名的PLSQL块还是有名的PLSQL程序,一般都要在数据库上执行,
对网络的负荷几乎没有影响。

这章到此为止。下次针对游标进行解释。

猜你喜欢

转载自blog.csdn.net/niusr_1980_01/article/details/113934612