Sql Oracle-插入存储过程外键

Sql Oracle-插入存储过程外键,sql,database,oracle,Sql,Database,Oracle,说明: 创建两个表,分别名为员工和部门。在表格名称前加上您的姓名首字母。通过名为dept的列链接两个表(外键)。为每个表编几个列名 员工表: create table bsemployees( dept number primary key, empName varchar2(20), salary number ); 部门表: create table bsdepartments( dept number references bsemploy

说明:

创建两个表,分别名为员工部门。在表格名称前加上您的姓名首字母。通过名为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;
/
•在departments表中插入一行

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;
/
我已经完成了这个任务,除了当我尝试在departments表中插入一行时,我得到了一个完整性约束-parent key not found错误

如果我执行了
执行sp_员工(5名,“John Doe”,90000)它将显示
***部门不存在***
,并将继续将数据插入bsemployees并将部门插入bsdepartments,根据我的if-then语句,部门名称将保留为空。执行select(*)显示了这一点


但是,如果我继续执行
执行sp_部门(1,“人力资源”)
将一行放入部门我得到父键错误。我知道我正在尝试插入没有父密钥的内容,但我不知道如何修复它。

您对表
部门的认识不正确。它应该链接如下

create table bsdepartments(
dept        number primary key,
deptName    varchar2(20)
);
并且应该链接到employee表

create table bsemployees(
dept        number references bsdepartments(dept),
empName     varchar2(20),
salary      number
);
然后,如果您尝试插入
执行sp_部门(1,“人力资源”)它将执行
A然后您必须插入员工


此处员工与部门相关,而不是与员工相关。

您的表设计不太正确-需要将部门主键添加为员工的外键(而不是主键),员工应该有自己的主键:

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
);
然后,您可以在检查部门过程中执行“添加如果不存在”逻辑:

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
    表,因此出现空列(但这是讲师要求的)