将oracle blob转换为xml类型

时间:2013-05-15 06:31:16

标签: xml oracle utf-8 plsql blob

我有使用MSSQL 2008的经验,最近我不得不从MSSQL迁移到Oracle 10g。 设计(Oracle)表的人员(我需要从中提取数据的列)使用BLOB类型列来存储他们需要的XML。

在MSSQL中,您只需将XML字符串存储在XML类型中或使用VARCHAR(MAX)。假设一个表myTable,其中包含一个名为myColumn的列VARCHAR(MAX),其中包含<ROOT><a>111</a></ROOT>如果您想将VARCHAR(MAX)类型转换为XML类型你只需写一些像:

SELECT CONVERT(XML, myColumn) FROM myTable

如果您愿意,可以使用XQuery从转换后的列中获取数据,如下所示:

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

如果myColumn是BLOB,你如何在Oracle 10g中完成同样的事情,而不必编写存储过程但仍然可以重用它? BLOB中的文本为UFT-8

我非常感谢你的帮助,因为我急需这件事。

3 个答案:

答案 0 :(得分:8)

select
XMLType( BLOB_COLUMN,
         1 /* this is your character set ID.
                   1 == USASCII */
       ) as XML
from my_table;

更多字符集: http://www.mydul.net/charsets.html

答案 1 :(得分: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()函数。

答案 2 :(得分:1)