繁体   English   中英

从 Oracle 11 迁移到 19c

[英]Migrating from Oracle 11 to 19c

我们正在从 Oracle 11.2 迁移到 19c。 当数据库对象被移动时,很少有包是无效的。 所有这些包都涉及更新具有 clob 数据的表(比如 tableA)。 并且 tableA 使用“select..for update some_column nowait”锁定

cursor c1 is  select * 
  from table A,
      XMLTable(....)
   where A.id=1
   FOR UPDATE of A.ind NOWAIT

错误状态“不允许更新此查询表达式的 ORA-01786”

我阅读了 oracle 论坛并与 DBA 进行了交谈。 建议的解决方案是编写一个 select 进行更新,该更新不涉及 JSON 数据”(文档 ID 2507724.1,补丁 28822515)

几乎不可能重写 package。 有人可以帮助我了解如何知道这个补丁是否有已知的错误,或者是否有任何其他补丁可以克服这个问题?

目前尚不清楚您看到的错误是否来自影响 JSON 数据的相同更改,但它似乎也可能适用于 XML 数据。

如果是这样,那将不是一个错误,因为您提到的 MoS 文档所说的更改是在补丁 28822515 中引入的,显然是在修复一个错误,因为它不会在这种情况下抛出 ORA-01786。 (该补丁是 19c 之前版本的 2019 年 1 月 CPU;该文件再次表示,这是将 19c 中的更改向后移植到早期版本。)

一个更完整的例子,如:

declare
  cursor c1 is
    select * 
    from A,
        XMLTable('/x/y/z' passing A.xml columns z number path '.')
     where A.id=1
     FOR UPDATE of A.ind NOWAIT;
begin
  for r1 in c1 loop
    dbms_output.put_line(r1.id || ': ' || r1.z);
  end loop;
end;
/

在 11gR2 (11.2.0.2)相对未打补丁的 18c (18.4) 中按预期工作,但在 21c (21.3) 中出现错误 - 这本质上是 19c 的演进版本。

避免错误似乎相当简单 - 您需要将锁定表以进行更新的 cursor 与 XMLTable 调用分开,至少在此示例中您可以轻松地使用嵌套游标:

declare
  cursor c1 is
    select * 
    from A
     where A.id=1
     FOR UPDATE of A.ind NOWAIT;
  cursor c2(xml xmltype) is
    select *
    from XMLTable('/x/y/z' passing c2.xml columns z number path '.');
begin
  for r1 in c1 loop
    for r2 in c2(r1.xml) loop
      dbms_output.put_line(r1.id || ': ' || r2.z);
    end loop;
  end loop;
end;
/

这显示在上面链接的三个 db<>fiddles 中工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM