将oracle blob转换为xml类型

use*_*734 7 xml oracle plsql blob utf-8

我有使用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
Run Code Online (Sandbox Code Playgroud)

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

SELECT CONVERT(XML, myColumn).query('/ROOT/a')
Run Code Online (Sandbox Code Playgroud)

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

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

小智 8

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

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


dav*_*mos 4

您可以从 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;
/
Run Code Online (Sandbox Code Playgroud)

对于上面的具体示例,您可以使用该EXTRACT()函数:

SELECT extract(blob_to_xmltype(myColumn), '/ROOT/a') FROM table_name;
Run Code Online (Sandbox Code Playgroud)

上面将返回另一个 XMLTYPE。如果你想获取节点的文本值,可以使用该EXTRACTVALUE()函数。