嗨,请你帮忙解决这个问题。
只能在DB中访问(仅选择).Oracle Database 11g企业版11.2.0.3.0版 - 64位。
该表包含许多字段和一个 ADVICE_DOC BLOB ;
问题是如何从blob字段中获取xml文档。
谢谢
答案 0 :(得分:0)
CREATE OR REPLACE FUNCTION BLOB_TO_CLOB( b BLOB )
RETURN CLOB
IS
c CLOB;
n NUMBER := 1;
w CONSTANT NUMBER(5) := 32767;
len CONSTANT NUMBER := LENGTH( b );
BEGIN
IF b IS NULL THEN
RETURN NULL;
END IF;
IF len = 0 THEN
RETURN EMPTY_CLOB();
END IF;
DBMS_LOB.CREATETEMPORARY( c, TRUE );
WHILE ( n + w <= len ) LOOP
DBMS_LOB.WRITEAPPEND( c, w, UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( b, w, n ) ) );
n := n + w;
END LOOP;
DBMS_LOB.WRITEAPPEND( c, len - n + 1, UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( b, len - n + 1, n ) ) );
RETURN c;
END;
/
然后你应该可以使用:
SELECT XMLType( BLOB_TO_CLOB( blob_column ) ) AS xml
FROM your_table;
或者只能进行只读访问:
VARIABLE cur REFCURSOR;
DECLARE
b BLOB;
c CLOB;
n NUMBER := 1;
w CONSTANT NUMBER(5) := 32767;
len NUMBER;
BEGIN
SELECT blob_column
INTO b
FROM your_table
WHERE id = 1;
IF b IS NOT NULL THEN
len := LENGTH( b );
IF len = 0 THEN
c := EMPTY_CLOB();
ELSE
DBMS_LOB.CREATETEMPORARY( c, TRUE );
WHILE ( n + w <= len ) LOOP
DBMS_LOB.WRITEAPPEND( c, w, UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( b, w, n ) ) );
n := n + w;
END LOOP;
DBMS_LOB.WRITEAPPEND( c, len - n + 1, UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( b, len - n + 1, n ) ) );
END IF;
END IF;
OPEN :cur FOR
SELECT XMLType( c )
FROM DUAL;
END;
/
PRINT cur;