2013-05-15 65 views
6

我有使用MSSQL 2008的經驗,最近我不得不從MSSQL轉移到Oracle 10g。 設計具有需要從中提取數據的列的(Oracle)表的人使用BLOB類型列作爲它們需要存儲的XML。將oracle blob轉換爲xml類型

在MSSQL中,您只需將您的XML字符串存儲在XML類型中或使用VARCHAR(MAX)即可。假設一個表myTable了一個名爲myColumn列這是一個包含<ROOT><a>111</a></ROOT>如果你想在VARCHAR(MAX)型轉換爲XML類型,你會簡單地寫東西像VARCHAR(MAX)

SELECT CONVERT(XML, myColumn) FROM myTable 

,如果你願意,你可以再使用XQuery從轉換的列中獲取數據,就像這樣:

SELECT CONVERT(XML, myColumn).query('/ROOT/a') 

你將如何完成同樣的事情在Oracle 10g中,如果myColumn是BLOB,而無需編寫存儲過程,但仍中號使它可重用? BLOB中的文本是UFT-8

我真的很感謝你的幫助,因爲我急需這種幫助。

回答

2

您可以從BLOB轉換爲CLOB,然後將CLOB傳遞給XMLTYPE的構造函數。這裏是一個功能...

-- PL/SQL function to convert a BLOB to an XMLTYPE 
-- Usage: SELECT blob_to_xmltype(blob_column) FROM table_name; 

CREATE OR REPLACE FUNCTION blob_to_xmltype (blob_in IN BLOB) 
RETURN XMLTYPE 
AS 
    v_clob CLOB; 
    v_varchar VARCHAR2(32767); 
    v_start PLS_INTEGER := 1; 
    v_buffer PLS_INTEGER := 32767; 
BEGIN 
    DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); 

    FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in)/v_buffer) 
    LOOP 
    v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); 
    DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar); 
    v_start := v_start + v_buffer; 
    END LOOP; 

    RETURN XMLTYPE(v_clob); 
END blob_to_xmltype; 
/

和特定上面的例子,你可以使用EXTRACT()功能:

SELECT extract(blob_to_xmltype(myColumn), '/ROOT/a') FROM table_name; 

以上將返回另一個XMLTYPE。如果您想獲取節點的文本值,則可以使用EXTRACTVALUE()函數。

+0

嗨Davmos非常感謝您的回覆,我想的是解決方案,你給。會讓你知道它是如何工作的。 – user1279734

+0

嗨Davmos,我不斷收到一個clob而不是和XMLTYPE,我該如何獲得一個xml類型? – user1279734

+0

Hi @ user1279734,上面的函數只能返回'XMLTYPE'。你打電話過得怎麼樣? – davmos