2016-07-25 70 views
0

在Oracle數據庫中,我讀從RESTful Web服務,看起來像這樣一些XML:問題帶上拉遠程XML數據到Oracle數據庫

<ns1:parent xmlns:ns1="http://www.example.com/xml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xs1:schemaLocation= "http://www.example.com/xml http://www.w3.org/2001/XMLSchema-instance"> 
    <ns1:child> 
     <ns1:options></ns1:options> 
     <ns1:variables></ns1:variables> 
     <ns1:values> 
     <ns1:value qualifiers="X" date="someTime">Value1</ns1:value> 
     <ns1:value qualifiers="X" date="someOtherTime">Value2</ns1:value> 
     ... 
     <ns1:value qualifiers="X" date="some100thTime">Value100</ns1:value> 
     </ns1:values> 
    </ns1:child> 

我再試圖藉此數據並使用下面的代碼將其提取到數據庫中。但是,當我這樣做時,它將創建一個只有SYSDATE字段的記錄,而其他兩個值爲空。我也用XMLTable嘗試過,但結果相同。我在想這個命名空間有問題,但是我找不到合適的語法,並且我嘗試過的所有其他組合都根本不返回任何行。

我們還從另一個幾乎相同的數據源(不使用名稱空間)提取數據,並且此代碼工作正常(當然,沒有所有的名稱空間)。我是否在某處獲得命名空間的語法錯誤?

DECLARE 
myXMLType XMLType := xmltype(We use a function to pull in the XML file here); 
BEGIN 
/*Outputting the XMLType here shows that data is in it*/ 
INSERT INTO output_table 
    SELECT 
    ExtractValue(VALUE(p), '/values/ns1:value', 
     'xmlns:ns1="http://www.example.com/xml"') AS myValue, 
    ExtractValue(VALUE(p), '//values/ns1:value/@ns1:date', 
     'xmlns:ns1="http://www.example.com/xml"') AS myTime, 
    SYSDATE AS read_date 
    FROM 
    TABLE(XMLSequence(EXTRACT(myXMLType, '/ns1:parent/ns1:child/ns1:values', 
     'xmlns:ns1="http://www.example.com/xml"')))p; 
    COMMIT; 
END; 
+1

請編輯XML示例以顯示完整的有效示例。 – OldProgrammer

+0

我不確定還需要添加什麼,這幾乎是整個文件,除了ns1:child下列出的兩個其他標記之外。無論如何我都加了他們。 –

回答

1

您可以像這樣使用XMLTable,但您需要supply an XMLNameSpaces clause too。這是使用所謂的string綁定變量持有你的XML文本(一對夫婦更正):代替XMLType(:string)

var string varchar2(200); 

begin 
    :string := '<ns1:parent xmlns:ns1="http://www.example.com/xml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    ns1:schemaLocation= "http://www.example.com/xml http://www.w3.org/2001/XMLSchema-instance"> 
    <ns1:child> 
     <ns1:values> 
     <ns1:value qualifiers="X" date="someTime">Value1</ns1:value> 
     <ns1:value qualifiers="X" date="someOtherTime">Value2</ns1:value> 
     </ns1:values> 
    </ns1:child> 
    </ns1:parent>'; 
end; 
/

SELECT myValue, myTime, SYSDATE AS read_date 
FROM XMLTable(XMLNamespaces('http://www.example.com/xml' as "ns1"), 
    '/ns1:parent/ns1:child/ns1:values/ns1:value' 
    passing XMLType(:string) 
    columns myValue varchar2(20) path '.', 
    myTime varchar2(20) path '@date' 
); 

MYVALUE    MYTIME    READ_DATE 
-------------------- -------------------- ---------- 
Value1    someTime    2016-07-25 
Value2    someOtherTime  2016-07-25 

您可以使用myXMLType變量passing子句中做同樣的事情與insert ... select

ExtractValue is deprecated anyway,並且只能返回一個節點,所以如果您擁有XPath權限,它將獲得ORA-19025。

+0

雖然有效,但我在嘗試使用XMLTable時實際上也有同樣的事情,除了我做了「XMLTable(XMLNamespaces(url_address as」ns1「), '/ ns1:parent/ns1:child/ns1:values'在列路徑中的值路徑...猜它不喜歡那個。謝謝! –

+1

@BigEMPin-我認爲如果你已經提出了'ns1:value'這個路徑,那麼就會得到ORA-19279;如果你只是在沒有命名空間的情況下只使用了'value',那麼結果也是一樣的空白。所以我猜你很接近* 8-) –