Oracle SQL,Insert statement inside if not 运行
Oracle SQL, Insert statement inside if not running
所以我正在尝试创建一个小型 Oracle APEX 应用程序,允许人们在诊所进行预约。我制定了一个负责预约的程序。该应用程序有一个 table 可以保存有关预约人员的数据,还有一个 table 用于保存约会。该过程检查用户是否已经在患者 table 中,如果他在那里,它应该只在约会 table 中添加一行,否则它也会在患者 table 中添加它们。
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 子句内的插入。即使患者不在数据库中,它也会跳转到第二个插入,这会产生错误,因为未创建约会的前键 table (cnp)。
问题很可能是标识符范围;我猜你的程序有一个参数 (cnp),它与患者 table 中的列同名。因为您没有限定查询中的参数引用(即 where p.cnp = procedure_name.cnp
),Oracle 认为您在该列等于该列(即 where p.cnp = p.cnp
)的行之后,这意味着您永远不会得到0 除非 table.
中没有行
为避免此问题,您可以在引用参数时对其进行限定(PL/SQL 的产品经理 Bryn Llewellyn 建议您这样做)或者您可以更改参数的名称(例如,类似于p_cnp
).
话虽如此,只计算是否需要插入是一种浪费。为什么查询 table 只是为了执行下一步插入,而您可以插入记录并捕获 dup_val_on_index 错误(假设您定义了 primary/unique 键!您有,对吧?)或使用改为合并语句?您应该以尽可能少的工作为目标,以构建高性能代码。
我可能会选择合并,例如:
merge into patients tgt
using (select procedure_name.cnp from dual) src
on tgt.cnp = src.cnp
when not matched then
insert (tgt.cnp, tgt.name, ....)
values (src.cnp, procedure_name.name, ....);
所以我正在尝试创建一个小型 Oracle APEX 应用程序,允许人们在诊所进行预约。我制定了一个负责预约的程序。该应用程序有一个 table 可以保存有关预约人员的数据,还有一个 table 用于保存约会。该过程检查用户是否已经在患者 table 中,如果他在那里,它应该只在约会 table 中添加一行,否则它也会在患者 table 中添加它们。
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 子句内的插入。即使患者不在数据库中,它也会跳转到第二个插入,这会产生错误,因为未创建约会的前键 table (cnp)。
问题很可能是标识符范围;我猜你的程序有一个参数 (cnp),它与患者 table 中的列同名。因为您没有限定查询中的参数引用(即 where p.cnp = procedure_name.cnp
),Oracle 认为您在该列等于该列(即 where p.cnp = p.cnp
)的行之后,这意味着您永远不会得到0 除非 table.
为避免此问题,您可以在引用参数时对其进行限定(PL/SQL 的产品经理 Bryn Llewellyn 建议您这样做)或者您可以更改参数的名称(例如,类似于p_cnp
).
话虽如此,只计算是否需要插入是一种浪费。为什么查询 table 只是为了执行下一步插入,而您可以插入记录并捕获 dup_val_on_index 错误(假设您定义了 primary/unique 键!您有,对吧?)或使用改为合并语句?您应该以尽可能少的工作为目标,以构建高性能代码。
我可能会选择合并,例如:
merge into patients tgt
using (select procedure_name.cnp from dual) src
on tgt.cnp = src.cnp
when not matched then
insert (tgt.cnp, tgt.name, ....)
values (src.cnp, procedure_name.name, ....);