Sql Oracle-插入存储过程外键
说明: 创建两个表,分别名为员工和部门。在表格名称前加上您的姓名首字母。通过名为dept的列链接两个表(外键)。为每个表编几个列名 员工表: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
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 justemployees
- 正如您所注意到的,“如果不存在添加”方法的问题是您没有足够的数据来完全填充
department
表,因此出现空列(但这是讲师要求的)