2014-12-05 34 views
1

說明:  甲骨文 - 插入存儲過程外鍵

創建兩個表,一個名爲員工部門。在您的姓名首字母前加上表格名稱。通過名爲Dept的列鏈接兩個表(外鍵)。爲每個表組成幾個列名。

員工表:

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並插入部門#爲bsdepartments和DEPTNAME將根據留空我的if-then聲明。做一個選擇(*)顯示我這一點。

但是,如果我繼續前進,做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 PROC邏輯:

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; 

,然後簡化了員工插入PROC因爲它應該保證一個部門:

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 employees
  • 正如你所指出的,'如果不存在'方法的問題是你沒有足夠的數據來完成填充department表,因此空列(但這是你的講師要求)
1

您對錶department的反應很差。它應該鏈接如下

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

,它應該,如果你嘗試插入execute sp_departments(1, 'human resources');鏈接到employee表

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

然後,它會執行 的,那麼你必須插入員工。

這裏員工與部門相關而不是部門與員工相關。