我在這里搜索了幾篇文章并嘗試了不同的方法。我沒有得到錯誤,但我也沒有得到輸出。在我們的系統中,我們將傳入的 xml 事務存盤在 CLOB 列L80T2.tridata中,現在用戶希望在新事務出現時得到警告,以便他們可以檢查資料庫中的所有重要欄位是否都已填充。
在示例中,我希望將 PartId 作為輸出,即<Id>R31312/CL7C</Id>
這是完整的xml
<MaXML_Envelope version="0140"xsi:schemaLocation="http://www.xxx.kom/Distro ../../../../mastd/xsd/MaXMLDoc/0140_PartUpdate_0100.xsd ">
<PartUpdate version="0100">
<ControlArea>
<Sender>
<Division>A1</Division>
<Confirmation>0</Confirmation>
</Sender>
<CreationDateTime>2022-02-15T00:00:00Z</CreationDateTime>
<RefId>
<ReferenceId>90000206</ReferenceId>
</RefId>
<TransactionType>LP04</TransactionType>
<SenderId>TRNM</SenderId>
<ReceiverId>FMHW</ReceiverId>
</ControlArea>
<DataArea>
<DataBaseTransaction sequence="1">
<PartUpdate>
<PartId>
===> <Id>R31312/CL7C</Id>
<Revision>9105</Revision>
<Division>A1</Division>
</PartId>
<Description>1606058</Description>
<UnitType/>
<PartToleranceArea>
<Inspection>N</Inspection>
</PartToleranceArea>
<UserArea>
<Wadmkey/>
<Description>1606058</Description>
<LanguageDescr_Segment sequence="1">
<DescrLanguage>EN</DescrLanguage>
<Description>1606058</Description>
</LanguageDescr_Segment>
<PartType>C</PartType>
<PartWeight>0.0</PartWeight>
<PartWeightUnit>KGM</PartWeightUnit>
<SingleUnitInstance/>
<HandlingUnitInstance/>
<PackCode/>
<ComCode/>
</UserArea>
</PartUpdate>
</DataBaseTransaction>
</DataArea>
</PartUpdate>
</MaXML_Envelope>
到目前為止,我已經完成了以下查詢(sqlplus)
SELECT XMLQUERY(
'declare default element namespace "http://www.xxx.kom/Distro ../../../../mastd/xsd/MaXMLDoc/0140_PartUpdate_0100.xsd"; (: :)
/PartUpdate/DataArea/DataBaseTransaction/PartId/Id/text()'
PASSING XMLTYPE(L80T2.tridata)
RETURNING CONTENT
) myxmldata, L79T1.trno, L79T1.comtype
from L79T1
inner join L80T2 on (L80T2.trno = L79T1.trno)
where L79T1.trtype = '702'
這是上述查詢的輸出
MYXMLDATA
------------------
TRNO COMT
---------- ----
161657423 MQS
161672521 MQS
161666181 MQS
我究竟做錯了什么?
我期待類似的東西:
MYXMLDATA TRNO COMT
----------- --------- ----
R31312/CL7C 161657423 MQS
V34132/AB 161672521 MQS
OR-12BC 161666181 MQS
謝謝你的幫助。
uj5u.com熱心網友回復:
您的路徑缺少MaXML_Envelope根節點和中間PartUpdate節點。
所以這:
/PartUpdate/DataArea/DataBaseTransaction/PartId/Id/text()
應該:
/MaXML_Envelope/PartUpdate/DataArea/DataBaseTransaction/PartUpdate/PartId/Id/text()
你也不需要宣告一個默認的命名空間,至少你已經展示了;但是您的 XML 應該宣告xsi命名空間(或者必須宣告,否則您將看不到現在所做的結果;所以您在發布時丟失了它?)。
你可能還想打電話getStringVal()來獲得varchar2結果。
在全:
SELECT XMLQUERY(
'/MaXML_Envelope/PartUpdate/DataArea/DataBaseTransaction/PartUpdate/PartId/Id/text()'
PASSING XMLTYPE(L80T2.tridata)
RETURNING CONTENT
).getStringVal() myxmldata, L79T1.trno, L79T1.comtype
from L79T1
inner join L80T2 on (L80T2.trno = L79T1.trno)
where L79T1.trtype = '702'
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/447874.html
