我尝试了很多方法,但仍然无法从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来获取它,但是没有运气。谢谢。
答案 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)
希望我已经正确理解了这个问题。
我认为,下面的查询将为您提供帮助。
blob
列转换为XMLTYPE
,这也将有助于检查XML是否有效。
packet(7)
然后,使用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内容:
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;
在Oracle Apex中创建了名为“例如:P5_XML”的“仅显示”(元素)
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;