Процедура с исключениями - PullRequest
0 голосов
/ 06 мая 2019

Я попытался создать процедуру для обновления строки в таблице «Отделы». Я должен проверить, является ли название отдела уникальным. Если он не уникален, он должен быть сохранен в новой таблице '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 голосов
/ 06 мая 2019

Я бы предложил уникальный индекс в столбце названия отдела.При этом Oracle не позволит вам обновить любое имя отдела, чтобы оно стало дубликатом.

Вот пример.

Во-первых, контрольный пример, основанный на таблице 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>
...