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
您可以从 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()函数。
| 归档时间: |
|
| 查看次数: |
28943 次 |
| 最近记录: |