我正在嘗試從 XML 檔案中獲取值,如下面的回應。我想提取值:289
<operationExecutionResponse>
<responseCode>0</responseCode>
<rootContext>
<stringList name="productIds">
<string>289</string>
<string>123</string>
</stringList>
</rootContext>
</operationExecutionResponse>
我試過這樣的事情:
SELECT EXTRACTVALUE (
r_val,
'//operationExecutionResponse/rootContex/stringList/string[1]')
INTO n_id
FROM DUAL;
SELECT EXTRACTVALUE (
r_val,
'//operationExecutionResponse/rootContex/stringList/string[@name="productIds"]/text()')
INTO n_id
FROM DUAL;
我怎樣才能得到我想要的價值?
uj5u.com熱心網友回復:
嘗試這個:
WITH XML_TBL
AS (SELECT XMLTYPE('<operationExecutionResponse>
<responseCode>0</responseCode>
<rootContext>
<stringList name="productIds">
<string>289</string>
<string>123</string>
</stringList>
</rootContext>
</operationExecutionResponse>') XMLDATA
FROM DUAL)
SELECT VALS
FROM XML_TBL
, XMLTABLE(
'operationExecutionResponse/rootContext/stringList//*'
PASSING XML_TBL.XMLDATA
COLUMNS VALS VARCHAR2(100) PATH 'text()'
);
uj5u.com熱心網友回復:
您的第一次嘗試幾乎是正確的,但您拼寫rootContext錯誤 - 它錯過了 final t。更正后就可以了。(您的第二個在錯誤的節點上有屬性名稱過濾器,并且會嘗試回傳所有值而不僅僅是第一個。)
但extractvalue()已棄用。你可以做同樣的事情XMLQuery():
select XMLQuery(
'/operationExecutionResponse/rootContext/stringList/string[1]/text()'
passing r_val
returning content
).getstringval()
into n_id
from dual;
或者你似乎期待一個數字:
select to_number(
XMLQuery(
'/operationExecutionResponse/rootContext/stringList/string[1]/text()'
passing r_val
returning content
).getstringval()
)
into n_id
from dual;
db<>小提琴
在這兩種情況下,只會從串列中獲取第一個字串/數字,這就是您的原始代碼所做的。如果您想獲取所有可以使用的值,XMLTable()如@Gnqz 所示,但是(當您在 PL/SQL 背景關系中執行此操作時)您需要將它們選擇到集合中或將其轉換為游標查詢和回圈超過它們 - 取決于你在擁有這些值后打算如何處理它們。
作為游標,您可能會這樣做:
for r in (
select n_id
from XMLTable(
'/operationExecutionResponse/rootContext/stringList[@name="productIds"]/string'
passing r_val
columns n_id number path '.'
)
)
loop
-- do something with the value, as r.n_id here
dbms_output.put_line('Number: ' || r.n_id);
end loop;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448735.html
