所以我正在尝试创建一个小型的Oracle APEX应用程序,允许人们在诊所预约。我制定了一个负责预约的程序。该应用程序有一个表格,用于保存有关约会人员和约会表格的数据。该过程检查用户是否已经在患者表中,如果他在那里,它应该只在约会表中添加一行,否则它也将它们添加到患者表中。
select COUNT(p.name) INTO da FROM patients p where p.cnp = cnp;
IF (da = 0) then
insert into patients values(cnp,name,surname,sex,birth_date,phone_no,email);
end if;
insert into appointments values(appointment_sequence.nextval,cnp,id_medic,date,time);
问题是它永远不会运行if子句中的插入。即使患者不在数据库中,它也会跳转到第二个插入,这会产生错误,因为没有创建约会表(cnp)的外键。
答案 0 :(得分:1)
问题最有可能归结为标识符范围;我猜你的程序参数(cnp)与Patients表中的列名相同。因为您没有在查询中限定参数引用(即where p.cnp = procedure_name.cnp
),所以Oracle认为您在该列等于该列的行之后(即where p.cnp = p.cnp
)意味着您永远不会得到计数0,除非表中没有行。
为避免此问题,您可以在引用参数时对参数进行限定(Bryn Llewellyn - PL / SQL的产品经理会建议您这样做),或者您可以更改参数的名称(例如{{1} })。
说了这么多,做一个计数只是为了弄清楚你是否需要插入是浪费。为什么查询表只是为了插入记录并捕获dup_val_on_index错误(假设您已经定义了主键/唯一键!你有,对吗?)或使用合并语句而只执行插入操作?您应该尽可能少地完成工作,以便构建高性能代码。
我可能会选择合并,例如:
p_cnp