gpt4 book ai didi

sql - 使用 "in"子句中的 "where"运算符更新行

转载 作者:行者123 更新时间:2023-12-05 00:41:53 25 4
gpt4 key购买 nike

我偶然发现了我不明白的 SQL 行为。我需要一次更新表中的几行;从找到它们开始:

SELECT * FROM some_table WHERE field1 IN (SELECT ...)

这返回了大约 60 行的选择。现在我非常有信心我得到了正确的子查询,所以我只修改了第一部分:
UPDATE some_table SET field2 = some_value WHERE field1 IN (SELECT ...)

换句话说,这与 WHERE 之后的第一个查询完全一样。 .但是,它导致更新了 0 行,而我预计是 60 行。请注意,上面的语句会更改 field2 ,即我验证了 some_value不在所选行中。

子查询是一个适度复杂的 SQL 片段,有 2 个(不同的)表、1 个 View 、连接和它自己的 WHERE条款。万一这很重要,它发生在 Oracle 数据库 10g 中。

所以,问题是, 为什么UPDATE没有触及 SELECT 返回的行 ?

最佳答案

终于把它钉牢了。原来在子查询选择中使用的 View 间接(通过另一个 View )称为存储过程/函数。然后该过程访问了在 UPDATE 中被修改的表。 .结果,Oracle 抛出异常“表 some_table 正在被修改,函数可能看不到结果”(不记得确切的文本)。但是使用的函数when other then return null最后,所以错误被有效地隐藏了,子查询根本没有返回任何东西——反过来 UPDATE没有效果。

道德:永远不要使用过于宽泛的异常捕获器。我在其他语言中遵循此规则,但显然不在 PL/SQL 中:-/

关于sql - 使用 "in"子句中的 "where"运算符更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670088/

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