2013-05-15 64 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