將視圖從 Oracle 遷移到 PostgreSQL(使用 extractvalue() 函式)
我正在將數據庫從 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() 表達式都計算為null
Oracle 視圖將返回'/'
但concat_ws()
將返回一個空字元串。如果您不想這樣,則需要使用與 Oracle 中相同的方法。