Postgresql

將視圖從 Oracle 遷移到 PostgreSQL(使用 extractvalue() 函式)

  • September 6, 2018

我正在將數據庫從 Oracle 遷移到 PostgreSQL,並且有幾個視圖有問題。

我找不到 extractvalue() 和 xmltype() 的等效函式…

NVL(extractvalue(xmltype(METADATA), '/slb/structMap/div/mptr/@OTHERLOCTYPE', 'xmlns="http://www.nb.admin.ch/standards/slb" xmlns:marc="http://www.loc.gov/MARC21/slim"'), '')  

這是完整的查看程式碼:

 CREATE OR REPLACE FORCE VIEW "INGEST_TEST"."AIP_TYPE_INFO" ("AIP_ID", "AIP_VERSION", "TYPE_VALUE") AS 
select
aip_id,
aip_version,
case 
   when METADATA is not null then
       NVL(extractvalue(xmltype(METADATA), '/slb/structMap/div/mptr/@OTHERLOCTYPE', 'xmlns="http://www.nb.admin.ch/standards/slb" xmlns:marc="http://www.loc.gov/MARC21/slim"'), '')  
       || '/' ||
       NVL(extractvalue(xmltype(METADATA), '/slb/structMap/div/div[position() = 1]/mptr/@OTHERLOCTYPE', 'xmlns="http://www.nb.admin.ch/standards/slb" xmlns:marc="http://www.loc.gov/MARC21/slim"'), '') 
   else '/'
end as type_value
from aip ;

甲骨文的功能是:

extractvalue(): https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions052.htm#i1131042

xmltype(): https://docs.oracle.com/cd/B10500_01/appdev.920/a96616/arxml24.htm

我要麼從未使用過這些函式和我正在遷移的數據庫。我只有將它遷移到 PostgreSQL 的任務。

NVL()函式在 PostgreSQL 中有它的等價物:COALESCE()

有人知道如何管理這個嗎?

這是 XML 內容的範例:https ://www.dropbox.com/s/59mosi9ewcx67ga/XML_EXEMPLE.xml?dl=0對於此範例,視圖應該給我這個:

雜誌/雜誌編號

Postgres 對 XMNL 命名空間的 XML 處理要嚴格一些,因此 xpath 表達式必須為每個元素添加正確的命名空間的前綴。

根據您的範例 XML,只http://www.nb.admin.ch/standards/slb需要命名空間,因此視圖應如下所示:

CREATE OR REPLACE FORCE VIEW AIP_TYPE_INFO
AS 
select aip_id,
      aip_version,
      case 
        when METADATA is not null then
           concat_ws('/', (xpath('/slb:slb/slb:structMap/slb:div/slb:mptr/@OTHERLOCTYPE', METADATA::xml, t.nsp))[1],
                          (xpath('/slb:slb/slb:structMap/slb:div/slb:div[position() = 1]/slb:mptr/@OTHERLOCTYPE', metadata::xml, t.nsp))[1])
        else '/'
      end as type_value
from aip, 
    (values (array[array['slb', 'http://www.nb.admin.ch/standards/slb']])) as t(nsp);

那個部分:

, (values (array[array['slb', 'http://www.nb.admin.ch/standards/slb']]))

只需創建一個包含所需命名空間定義數組的單行。它可以使實際xpath()通話時間更短。如果你不喜歡它,你可以替換t.nsp函式內部。array[array['slb', 'http://www.nb.admin.ch/standards/slb']]

請注意,它xpath()返回一個匹配數組。這(xpath(...))[1]就是需要的原因:它只是從數組中獲取第一個匹配項。

concat_ws()將自動處理 NULL 值 - 這與 Oracle 版本略有不同。如果兩個 xpath() 表達式都計算為nullOracle 視圖將返回'/'concat_ws()將返回一個空字元串。如果您不想這樣,則需要使用與 Oracle 中相同的方法。

線上範例:http ://rextester.com/FANG87147

引用自:https://dba.stackexchange.com/questions/216868