我对Oracle有着最奇怪的经历,希望有更多知识能帮助我。我正在编写一个存储过程来生成并尊重学校的卷名。荣誉卷名称的确切格式由函数生成(并且函数正常工作)。对于没有荣誉名称的人,该过程为名为NAME的表中的实体提供新记录,然后如果该函数生成与旧名称不同的名称,则会更新某人的荣誉名称(以考虑其他表的更新)
该过程还会在另一个表中生成审核信息,并计划在晚上运行。当我检查日志(在测试环境中)时,它表示插入了X行并且更新了Y行。但是,期望是0行更新,因为没有人拥有荣誉名称。
所以到达相关的东西,下面是我正在使用的简化代码。让我们说这个函数应该返回'John '69&简琼斯'70史密斯'
insert into NAME
select ID_NUMBER,
NAME_FUNCTION(ID_NUMBER)
from ENTITY
此后更新运行
update NAME
set TENTCARD_NAME = NAME_FUNCTION(ID_NUMBER)
where TENTCARD_NAME != NAME_FUNCTION(ID_NUMBER)
所以问题是插入的值是'John '69& Jane '70 Smith'(删除了处女名)在插入查询中。请记住,如果您从双重选择NAME_FUNCTION(ID_NUMBER),该功能将完美无缺。此外,如果将select子句与insert子句分开,它将返回正确的值。
如果情节变粗,人们会期望因为插错了,更新会修复它。不!更新将更新0行,即使我的审计查询说它应该更新160。
如果我只是运行update语句并从前端客户端查看受影响的实体,则会显示错误的值。
此时任何想法和/或建议都会非常有用!
编辑:这是我可以编写的最简单的测试
insert into name (id_number, tentcard_name, date_added)
select e.id_number,
bu_hrdnames(e.id_number,'N','N','Y','Y','Y') as tentcard_name,
sysdate as date_added
from entity e
where e.id_number = '0000001034'
这会插入值'Robert '69 MBA '73&凯瑟琳'70安徒生' 什么时候应该插入'Robert '69 MBA '73&凯瑟琳威尔逊'70安徒生'。如果我只是执行此查询,它会做什么:
select e.id_number,
bu_hrdnames(e.id_number,'N','N','Y','Y','Y') as tentcard_name,
sysdate as date_added
from entity e
where e.id_number = '0000001034'