2014-12-05 3 views
1

Инструкции:  Oracle - Вставка хранимая процедура FOREIGN KEY

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

Сотрудники Таблица:

create table bsemployees(
dept  number primary key, 
empName  varchar2(20), 
salary  number 
); 

Отделы Таблица:

create table bsdepartments(
dept  number references bsemployees(dept), 
deptName varchar2(20) 
); 

Написать следующие хранимые процедуры:

• вставить строку в сотрудников таблицы. Если отдел не существует. Вставьте его в отделов стол.

create or replace procedure sp_employees(
    a_dept IN number, 
    a_empName IN varchar2, 
    a_salary IN number 
) 
as 
    vCount number; 
BEGIN 
    sp_check_dept(a_dept,vCount); 

    insert into bsemployees values(a_dept, a_empName, a_salary); 

    if vCount = 0 then 
     dbms_output.put_line('**DEPT DOES NOT EXIST**'); 
     insert into bsdepartments (dept, deptName) values(a_dept, NULL); 
    end if; 
END; 
/

create or replace procedure sp_check_dept(
    a_dept IN number, 
    vCount OUT number 
) 
as 
BEGIN 
    select count(*) 
    into vCount 
    from bsdepartments 
    where dept = a_dept; 
end; 
/

• Вставьте строку в таблицу отделов.

create or replace procedure sp_departments(
    a_dept IN number, 
    a_deptName IN varchar2 
) 
as 
BEGIN 
    insert into bsdepartments values(a_dept, a_deptName); 
END; 
/

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

Если я execute sp_employees(5, 'John Doe', 90000); Он будет отображать ***DEPT DOES NOT EXIST*** и будет идти вперед и вставить данные в bsemployees и вставьте DEPT # в bsdepartments и DEPTNAME останется пустым на основе моего если-то заявление. Выполнение select (*) показывает мне это.

Однако если я иду вперед и делать execute sp_departments(1, 'human resources'); поместить строку в отделов я получаю ошибку клавишного родителя. Я понимаю, что я пытаюсь вставить что-то, у которого нет родительского ключа, но я не знаю, как его исправить.

ответ

1

Ваш дизайн стола не совсем правильно - отдел первичный ключ должен быть добавлен в качестве внешнего ключа к работнику (не в качестве первичного ключа), и работник должен иметь свой собственный первичный ключ:

create table bsdepartments(
    dept  number primary key, 
    deptName varchar2(20) 
); 


create table bsemployees(
    empName  varchar2(20) primary key, 
    dept  number references bsdepartments(dept), 
    salary  number 
); 

Вы можете сделать «добавить, если не существует» логика в check_dept прок:

create or replace procedure sp_check_dept(
    a_dept IN number 
) 
as 
    vCount number 
BEGIN 
    select count(*) 
     into vCount 
     from bsdepartments 
     where dept = a_dept; 

    if (vCount = 0) then 
     dbms_output.put_line('**DEPT DOES NOT EXIST**'); 
     insert into bsdepartments (dept, deptName) values(a_dept, NULL); 
    end if; 
end; 

Который затем упрощает работника вставки прок, как это должно быть гарантировано отдела:

create or replace procedure sp_insertEmployee(
    a_dept IN number, 
    a_empName IN varchar2, 
    a_salary IN number 
) 
as 
BEGIN 
    sp_check_dept(a_dept); 

    insert into bsemployees values(a_dept, a_empName, a_salary); 
END 

Примечание

  • Рекомендует ли вы назвать проки в соответствии с их назначением, например, insertEmployee vs just employees
  • Как вы уже отметили, проблема с подходом «добавить, если не существует» заключается в том, что у вас недостаточно данных, чтобы полностью заполнить таблицу department, следовательно, нулевой столбец (но это то, что ваш лектор)
1

Ваше намерение разместить стол department Плохо. Он должен компонуются как ниже

create table bsdepartments(
dept  number primary key, 
deptName varchar2(20) 
); 

, и она должна быть связана с таблицей сотрудников

create table bsemployees(
dept  number references bsdepartments(dept), 
empName  varchar2(20), 
salary  number 
); 

Затем, если вы попытаетесь вставить execute sp_departments(1, 'human resources'); он будет выполнять в то вы должны вставить работника.

Здесь сотрудник связан с отделом, а отдел не связан с сотрудником.

Смежные вопросы