簡體   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