【问题标题】:From DB2 to Oracle PLSQL从 DB2 到 Oracle PLSQL
【发布时间】: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

标签: sql oracle db2 locking


【解决方案1】:

Oracle 允许按视图更新表,即“可更新视图”。基本上,视图应该满足几个条件才能启用更新操作,应该有:
- 视图定义中没有 DISTINCT 子句,
- 视图定义中没有 GROUP BY 操作。

您的错误代码可能指向这种不可更新的视图。

【讨论】:

  • 这个问题专门针对 ORA-02014,它与使用 FOR UPDATE 子句修改的查询有关。在这种情况下,错误消息中提到的 "view" 很可能是内联视图(又名派生表)。例如,如果查询有一个使用 ROWNUM 应用过滤器的内联视图,我们会收到此错误。简而言之,您的答案没有错,但还不够完整,无法真正提供帮助。
猜你喜欢
  • 2020-12-22
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多