例外程序

时间:2019-05-06 17:56:35

标签: oracle exception sqlplus procedure

我尝试创建更新表“部门”中行的过程。我必须检查部门名称是否唯一。如果不是唯一的,则必须将其存储在新表“ ERROR_DEPART”中。我已经尝试过这样做,但是我无法执行代码。

CREATE PROCEDURE UPD_DEPARTMENT IS
   v_depid department.department_id%TYPE;
   v_depn department.department_name%TYPE;
   v_lid department.location_id%TYPE;
   v_phn employees.phone_number%TYPE;
BEGIN
   select distinct departments.department_name, locations.location_id, employees.phone_number
   into v_depn, v_lid, v_phn
   from departments 
   inner join locations
   on departments.location_id = locations.location_id
   inner join employees
   on departments.manager_id = employees.employee_id
END;

1 个答案:

答案 0 :(得分:0)

我建议在部门名称列上使用唯一索引。这样做,Oracle不允许您更新任何部门名称,以使其重复。

这是一个例子。

首先,基于Scott的DEPT表,进行测试:

SQL> create table depart as select * From dept;

Table created.

SQL> create unique index ui1_dept on depart (dname);

Index created.

SQL> create table error_depart as select * From depart where 1 = 2;

Table created.

SQL>

如果违反了唯一性,则该过程-在异常处理程序部分中-在ERROR_DEPART表中插入一行。

SQL> create or replace procedure p_upd_dept (par_deptno in number, par_dname in varchar2)
  2  is
  3  begin
  4    update depart d set
  5      d.dname = par_dname
  6      where d.deptno = par_deptno;
  7
  8  exception
  9    when dup_val_on_index then
 10      insert into error_Depart(deptno, dname) values (par_Deptno, par_dname);
 11  end;
 12  /

Procedure created.

SQL>

测试:首先,我们现在拥有什么?

SQL> select * From depart;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> begin
  2    p_upd_dept(10, 'SALES');        --> a duplicate
  3    p_upd_dept(20, 'new dept');     --> not a duplicate
  4  end;
  5  /

PL/SQL procedure successfully completed.

SQL> select * from depart;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 new dept       DALLAS         --> not a duplicate - updated
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> select * From error_depart;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 SALES                              --> duplicate

SQL>