发布如何从oracle中的blob获取xml,并在数据库

时间:2016-01-08 09:33:00

标签: xml oracle blob

嗨,请你帮忙解决这个问题。

只能在DB中访问(仅选择).Oracle Database 11g企业版11.2.0.3.0版 - 64位。 该表包含许多字段和一个 ADVICE_DOC BLOB ;
问题是如何从blob字段中获取xml文档。

谢谢

1 个答案:

答案 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;
相关问题