gpt4 book ai didi

Oracle Select 有效,Update 无效,相同的 WHERE 子句

转载 作者:行者123 更新时间:2023-12-02 05:28:26 26 4
gpt4 key购买 nike

最终更新:

事实证明,无论如何,在我们的例子中,这不是一个错误。隐藏在函数调用深处的是一个异常处理程序,它混淆了一条错误消息,表明该函数正在发生变化。处理程序将其隐藏起来,并导致函数返回本质上有效的值。所以,这一次,轮到我们了。 :)

原帖:

首先,这实际上更像是一种好奇,因为我已经使用 PL/SQL block 解决了这个问题。然而,我和我的同事都不知道这个更新不起作用。有人有什么想法吗?

我正在尝试使用适当的值更新新列。以前,记录的状态是使用按需计算状态的函数来确定的,我们只是将其转换为使用专用表,允许存储状态并提高 future 的灵 active 。

下面的选择效果很好 - 它提取 14 条记录:

select * 
from QUERY_TABLE QT1
where QT1.P_ID in
(select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value');

但是,以下更新使用相同的 WHERE 子句,更新 0 条记录:

update QUERY_TABLE QT1
set QT1.STAT_ID = 1
where QT1.P_ID in
(select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value');

不确定这是否有帮助,但下面的 PL/SQL block 可以很好地处理更新:

begin
for x in (
select QT2.P_ID opi
from QUERY_TABLE QT2
where F_GET_STATUS(QT2.FUNC_VAL_1,
(select RT.FUNC_VAL_2 from RELATED_TABLE RT where RT.RELKEY = QT2.RELKEY)) = 'Value')

loop
update QUERY_TABLE QT1
set QT1.STAT_ID = 1
where P_ID = x.opi;
end loop;
end;
/

我已使用架构所有者和具有适当权限的另一个用户执行了更新。表上没有触发器使更新无效。该函数不会做任何奇怪的事情,并且函数和更新不会相互影响(这是一个全新的列 - 函数在语法上独立于列的值)。它不会给出任何错误消息 - 它只更新 0 列。

更新1对于那些可能遇到同样问题的人,我们已经联系了Oracle,事实证明这是一个新的错误。它已被记录为错误 17015253:子查询中的函数更新语句不会更新行,尽管我在知识库中还没有看到它。

最佳答案

我的经理很棒!她建议添加:
杂注autonomous_transaction;
函数体中的'is'后面可以解决问题。
请参阅http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/autotransaction_pragma.htm了解详情。

例如
函数 xyz (...)
返回varchar2

杂注autonomous_transaction;
一些 varchar2(10);
.
.
.
开始
.
.
.
返回一些东西;
结束xyz​​;

关于Oracle Select 有效,Update 无效,相同的 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com