Oracle dbms_xmldom 如何创建blob节点?

Posted

技术标签:

【中文标题】Oracle dbms_xmldom 如何创建blob节点?【英文标题】:Oracle dbms_xmldom How to create a blob node? 【发布时间】:2014-10-18 07:17:26 【问题描述】:

我确实有 CR_ELEMENT 过程,它使我可以添加一个节点。 我现在必须创建一个 blob 节点,我想知道如何使用像 CR_BLOB_ELEMENT 这样的过程来完成它。

有人可以给我一个提示吗?

问候,

皮埃尔

PS:我使用的是 Oracle Database 11g 版本 11.2.0.4.0

 CR_BLOB_ELEMENT(l_domdoc in out dbms_xmldom.DOMDocument,
                               ref_node in dbms_xmldom.DOMNode,
                               nomel    in varchar2,
                               blobtobeadded   in blob)


   procedure CR_ELEMENT(l_domdoc in out dbms_xmldom.DOMDocument,
                           ref_node in dbms_xmldom.DOMNode,
                           nomel    in varchar2,
                           vnomel   in varchar2) as

        element  dbms_xmldom.DOMElement;
        node     dbms_xmldom.DOMNode;
        text     dbms_xmldom.DOMText;
        textnode dbms_xmldom.DOMNode;
      begin
        element  := dbms_xmldom.createElement(l_domdoc, nomel);
        node     := dbms_xmldom.appendChild(ref_node,
                                            dbms_xmldom.makeNode(element));
        text     := dbms_xmldom.createTextNode(l_domdoc, vnomel);
        textnode := dbms_xmldom.appendChild(node, dbms_xmldom.makeNode(text));

      end;

【问题讨论】:

那么您需要将二进制数据转换为 XML 文档吗?如果是这样,那么一种选择是将二进制数据编码为 Base64 格式。 Tks Jokke。我确实有base64编码的blob到数据库中,但是在将它写入xml时我被卡住了。由于 varchar2 的限制,恐怕它的内容会被截断。我说的对吗? Base64 是基于文本的格式。如果您可以将 blob 转换为 clob/varchar2,那么您应该没有任何问题。如果大小受到限制,只需将数据分成更小的部分(还有很多其他问题/文章)。 对不起,我错了,DOM 节点大小可能有限制... 我找到了很多关于这个主题的文章,但实际上我还不清楚。感谢您的宝贵时间。 【参考方案1】:

如果对某人有用。 请在下面找到由 community.oracle.com 中的 odie_63 撰写的答案。 这是完美的工作。 问候, 皮埃尔

SQL> create table images (  
  2    id       integer  
  3  , name     varchar2(256)  
  4  , content  blob  
  5  );  

Table created  

SQL>  
SQL> declare  
  2   
  3    bf          bfile := bfilename('XML_DIR','base64.bin');  
  4    lob_ptr     blob;  
  5    dest_offs   integer := 1;  
  6    src_offs    integer := 1;  
  7   
  8  begin  
  9   
10    insert into images (id, name, content)  
11    values (1, 'Koala.jpg', empty_blob())  
12    returning content into lob_ptr;  
13   
14    dbms_lob.open(bf, dbms_lob.lob_readonly);  
15    dbms_lob.loadblobfromfile(lob_ptr, bf, dbms_lob.getlength(bf), dest_offs, src_offs);  
16    dbms_lob.close(bf);  
17   
18  end;  
19  /  

PL/SQL procedure successfully completed  

SQL> commit;  

Commit complete  

SQL>  
SQL> select id  
  2       , name  
  3       , utl_raw.cast_to_varchar2(dbms_lob.substr(content, 30)) as first_bytes  
  4       , dbms_lob.getlength(content) as lob_size  
  5  from images  
  6  /  

   ID NAME         FIRST_BYTES                      LOB_SIZE  
----- ------------ -------------------------------- ----------  
    1 Koala.jpg    /9j/4AAQSkZJRgABAgEAYABgAAD/7g      1068504  

SQL>  
SQL> declare  
  2   
  3    x_doc       xmltype;  
  4    domdoc      dbms_xmldom.DOMDocument;  
  5    domnode     dbms_xmldom.DOMNode;  
  6    domtext     dbms_xmldom.DOMText;  
  7    ostream     sys.utl_BinaryOutputStream;  
  8    chunksize   pls_integer;  
  9    offset      pls_integer := 1;  
10    buf         raw(32767);  
11    image       blob;  
12   
13  begin  
14   
15    select xmlelement("image",  
16             xmlelement("id", t.id)  
17           , xmlelement("name", t.name)  
18           , xmlelement("content")  
19           )  
20         , t.content  
21    into x_doc  
22       , image  
23    from images t  
24    where t.id = 1 ;  
25   
26    domdoc := dbms_xmldom.newDOMDocument(x_doc);  
27   
28    -- get /image/content node so that we can append a text node and stream the BLOB to it :  
29    domnode := dbms_xslprocessor.selectSingleNode(dbms_xmldom.makeNode(domdoc), '/image/content');  
30    domtext := dbms_xmldom.createTextNode(domdoc, null);  
31    domnode := dbms_xmldom.appendChild(domnode, dbms_xmldom.makeNode(domtext));  
32   
33    ostream := DBMS_XMLDOM.setNodeValueAsBinaryStream(domnode);  
34    chunksize := dbms_lob.getchunksize(image);  
35   
36    loop  
37      begin  
38        -- read BLOB in chunk of <chunksize> :  
39        dbms_lob.read(image, chunksize, offset, buf);  
40      exception  
41        when no_data_found then  
42          exit;  
43      end;  
44      -- write chunk to DOM node :  
45      ostream.write(buf, chunksize);  
46      offset := offset + chunksize;  
47    end loop;  
48   
49    ostream.flush();  
50    ostream.close();  
51   
52    dbms_xmldom.writeToFile(domdoc, 'XML_DIR/image.xml');  
53    dbms_xmldom.freeDocument(domdoc);  
54   
55  end;  
56  /  

PL/SQL procedure successfully completed  

Output in image.xml :

<image>  
  <id>1</id>  
  <name>Koala.jpg</name>  
  <content>/9j/4AAQSkZJRgABAgEAYABgAAD/7gAOQWRvYmUAZAAAAAAB/+EUI0V4aWYAAE1NACoAAAAIAAcB  
MgACAAAAFAAAAGIBOwACAAAABwAAAHZHRgADAAAAAQAEAABHSQADAAAAAQA/AACcnQABAAAADgAA  
AADqHAAHAAAH9AAAAACHaQAEAAAAAQAAAH0AAADnMjAwOTowMzoxMiAxMzo0ODoyOABDb3JiaXMA  
...  
aWpkRY6dqaJY42qFjs8ZZ5nlkjZpmJUiJ1+ijn3dVeTtb4B1R5NJVaEkn/V8+u4Xijpp6SFlimp6  
qNHgjlVIgrtLCyxll1NpaT6An6W92mA8HwkyadMeEZJjEDmvE/t/1f5uv//Z</content>  
</image>  

【讨论】:

以上是关于Oracle dbms_xmldom 如何创建blob节点?的主要内容,如果未能解决你的问题,请参考以下文章

PL SQL XMLDOM 更改行结束

ORACLE 各种连接

php Laravel刀片布局。了解如何使用Blade在Laravel中快速创建布局:https://www.cloudways.com/blog/create-laravel-bl

如何将 XML 属性作为列写入 Oracle 中的表?

如何从 Oracle SQL 中的 BLOB 获取文本内容

创建日期 - 应该在 BL 或 DAL 中设置此值?