【发布时间】:2020-01-31 13:03:39
【问题描述】:
我们目前正在构建一个基于 Oracle 数据库的应用程序。通过这个应用程序,我们想要替换与 DB2 数据库一起工作的现有应用程序。 有些程序是通过“for update of”语句实现的。这些在访问 DB2 时工作正常。但是,如果程序访问 oracle,我会收到以下错误消息:
ORA-02014: 无法从具有 DISTINCT、GROUP 的视图中选择 FOR UPDATE BY等
有没有办法在不处理程序的情况下解决这个问题?是否有允许这样做的属性?我们在 linux 服务器上使用 ojdbc8 驱动程序进行访问
从 21.01.2020 开始编辑
这里是一个在访问 oracle 数据库时不起作用的查询示例
SELECT DBU.VIEW3.COL7, DBU.VIEW3.COL2, DBU.VIEW3.COL3, DBU.VIEW3.COL4, DBU.VIEW3.COL5, DBU.VIEW3.COL6, DBU.VIEW1.*
FROM (
DBU.VIEW1 LEFT JOIN DBU.VIEW2
ON (DBU.VIEW1.COL1=DBU.VIEW2.COL1)
AND (DBU.VIEW1.COL2=DBU.VIEW2.COL2)
AND (DBU.VIEW1.COL3=DBU.VIEW2.COL3)
)
LEFT JOIN DBU.VIEW3 ON DBU.VIEW3.COL7=DBU.VIEW2.COL7
WHERE DBU.VIEW1.COL2='VALUE1'
AND DBU.VIEW1.COL3='VALUE2'
AND DBU.VIEW1.COL1='VALUE3'
AND DBU.VIEW1.COL4='VALUE4'
AND DBU.VIEW1.COL5='VALUE5'
FOR UPDATE OF COL6
提前致谢
【问题讨论】:
-
可能需要更改代码,但您的问题没有任何有用的信息可以提供具体建议。
-
错误信息似乎有道理。向我们展示故障选择。
-
FOR UPDATE 对表中的特定行发出锁定。听起来您的查询不允许 Oracle 确定需要锁定哪些行。我不知道这在 DB2 中是如何工作的,但您必须为 Oracle 重新编写查询。对不起。
-
如果您想问“如何修复出现此错误的代码?”那么您需要在edit 您的问题中包含minimal reproducible example 以及您尝试运行的源代码的最小示例。如果您问“这个错误是什么意思?”然后它不言自明-您不能在查询无法获得对行的引用以锁定它们的视图中使用
FOR UPDATE(即当您聚合行时)。 -
这里是一个例子:SELECT DBU.VIEW3.COL7, DBU.VIEW3.COL2, DBU.VIEW3.COL3, DBU.VIEW3.COL4, DBU.VIEW3.COL5, DBU.VIEW3.COL6, DBU.VIEW1.* FROM ( DBU.VIEW1 LEFT JOIN DBU.VIEW2 ON (DBU.VIEW1.COL1=DBU.VIEW2.COL1) AND (DBU.VIEW1.COL2=DBU.VIEW2.COL2) AND (DBU.VIEW1.COL3 =DBU.VIEW2.COL3) ) 在 DBU.VIEW3.COL7=DBU.VIEW2.COL7 上左加入 DBU.VIEW3,其中 DBU.VIEW1.COL2='VALUE1' AND DBU.VIEW1.COL3='VALUE2' AND DBU.VIEW1。 COL1='VALUE3' AND DBU.VIEW1.COL4='VALUE4' AND DBU.VIEW1.COL5='VALUE5' 用于更新 COL6