我有使用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
。
我非常感谢你的帮助,因为我急需这件事。
答案 0 :(得分:8)
select
XMLType( BLOB_COLUMN,
1 /* this is your character set ID.
1 == USASCII */
) as XML
from my_table;
答案 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)
如果myColumn是BLOB
SELECT EXTRACT(XMLTYPE.CREATEXML(myColumn), '/ROOT/a')
FROM myTable;
来源: