Oracle从BLOB获取XML

时间:2018-07-16 12:50:36

标签: sql oracle11g oracle-apex

我尝试了很多方法,但仍然无法从DB获取完整的XML文档。我想要实现的是在Oracle Apex中显示XML(仅显示元素),但是我无法从Blob中获取完整的XML。

SELECT 
    utl_raw.cast_to_varchar2(dbms_lob.substr(<blob_column>, 2000, 1))
FROM 
    <my_table> 
WHERE <some_id> = 123

也尝试用mimetype来获取它,但是没有运气。谢谢。

3 个答案:

答案 0 :(得分:2)

首先,您不应在服务器端将其转换为varchar,因为Oracle SQL的varchar字符串大小有4K的限制。您可以利用PL \ SQL块来检索数据,但是在这种情况下,您将受到32K的限制。有一种解决此问题的特殊方法:http://mayo-tech-ans.blogspot.com/2013/06/displaying-large-clobs-in-oracle-apex.html

答案 1 :(得分:1)

希望我已经正确理解了这个问题。

我认为,下面的查询将为您提供帮助。

  1. 首先,将blob列转换为XMLTYPE,这也将有助于检查XML是否有效。 packet(7)
  2. 然后,使用EXTRACTVALUE从XML中获取数据。

    select EXTRACTVALUE(xml_data,'/note/to')
    from
    (
    select XMLTYPE.createXML('<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Test body</body>
    </note>') xml_data from dual
    )
    ;
    

答案 2 :(得分:0)

为了获得完整的BLOB内容:

  1. 将BLOB转换为CLOB
create or replace FUNCTION blob_to_clob (blob_in IN BLOB)
RETURN CLOB
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 v_clob;

END blob_to_clob;
  1. 在Oracle Apex中创建了名为“例如:P5_XML”的“仅显示”(元素)

  2. PLSQL代码

declare
    v_clob    clob;
begin
    SELECT blob_to_clob(<blob_column>) INTO v_clob FROM <table> WHERE <some_column> = <something>;
    :P5_XML := v_clob;
end;