![](/img/trans.png)
[英]Migration from Oracle Database 11g to AWS RDS Oracle 19c Failures
[英]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.