2012-09-17 87 views
2

我試圖將一個CLOB保存到一個變量來執行像提取等操作。我有這樣的代碼:PLSQL CLOBS到變量

DECLARE 
    clob_rec CLOB; 
    n_rec NUMBER:=100; 
BEGIN 
    SELECT LOB INTO clob_rec FROM table1 WHERE ID = 1234; 
    n_rec := clob_rec.EXTRACT('//XPTO/text()', 'xmlns:XPTO').getNumVal(); 
END; 

我想從XML保存多個值,以各種變量像n_rec。如何獲取「對象實例(CLOB)」來執行函數或方法,如extract()

+1

您可以使用['dbms_lob'](http://docs.oracle.com/cd/E11882_01/appdev.112/e10577/ d_lob.htm)包來操縱CLOB變量;但'extract'是一個XML概念,所以你有'XMLType'專欄,或者你需要類似['XMLCast'](http://docs.oracle.com/cd/E14072_01/appdev.112/e10492 /xdb04cre.htm#CHDBIIJG)?不知道我明白這個問題足以發佈這個答案... –

回答

3

您需要先將其轉換成一個XMLType:

DECLARE 
    clob_rec CLOB; 
    n_rec NUMBER:=100; 
    x XMLType; 
BEGIN 
    SELECT LOB INTO clob_rec FROM table1 WHERE ID = 1234; 
    x := XMLType(clob_rec); 
    n_rec := x.EXTRACT('//XPTO/text()', 'xmlns:XPTO').getNumVal(); 
END; 
+0

蒂塔正是它傑弗裏坎普。我會將其標記爲解決方案,但我還有另一個問題,我真的很感謝你或任何其他人的幫助。有什麼辦法可以在從xml提取節點值時忽略名稱空間嗎?所有的XML都針對相同的SCHEMA進行驗證,但是它們有不同的名稱空間,一些是「er:xxx」,一些是「ns:yyy」。我想忽略這些命名空間,所以我將有一種方法可以對所有CLOBS執行相同的過程。非常感謝你。 – DaveQuinn

+1

我認爲對不同的模式分別制定程序會更好;儘管我認爲你可以通過使用'*'xpath表達式來跳過命名空間,例如'x.Extract('/ */node/text()')' - 但我不是XPath的世界專家,所以請親自嘗試一下:) –