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

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

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

如果 myColumn 是 a ,您将如何在 Oracle 10g 中完成同样的事情BLOB,而无需编写存储过程但仍使其可重用?BLOB 中的文本是UFT-8.

我非常感谢您的帮助,因为我有点急需这个。

4

3 回答 3

9
select
XMLType( BLOB_COLUMN,
         1 /* this is your character set ID.
                   1 == USASCII */
       ) as XML
from my_table;
于 2013-06-07T17:52:01.007 回答
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;
/

对于您上面的具体示例,您可以使用以下EXTRACT()功能:

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

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

于 2013-05-15T07:12:27.313 回答
1

如果 myColumn 是 BLOB

SELECT EXTRACT(XMLTYPE.CREATEXML(myColumn), '/ROOT/a')
FROM myTable;

来源:

于 2016-06-01T11:03:42.653 回答