无法从 CLOB 列写入正确的 XML 数据
Posted
技术标签:
【中文标题】无法从 CLOB 列写入正确的 XML 数据【英文标题】:Unable to write the correct XML data from CLOB column 【发布时间】:2015-06-29 15:08:58 【问题描述】:/* 我编写了以下程序,它将 CLOB 列数据以 XML 格式写入物理位置。该文件已成功写入,但被截断或缺少正确的 XML 格式。*/
CREATE OR REPLACE PROCEDURE p_generate_xml
IS
c_amount BINARY_INTEGER := 32767;
l_buffer VARCHAR2(32767);
l_chr10 PLS_INTEGER;
l_clobLen PLS_INTEGER;
l_fHandler UTL_FILE.FILE_TYPE;
l_pos PLS_INTEGER := 1;
l_clob CLOB;
l_message_num number;
l_cnt number;
l_err_msg varchar2(3000);
v_sysdate date;
BEGIN
l_message_num := 1;
for c2 in ( SELECT xml_clob , case_id FROM AUDIT_XML_CLOB where case_id = '2006S1000018')
loop
select count(1) into l_cnt from AUDIT_XML_CLOB where nvl(DBMS_LOB.GETLENGTH(xml_clob),0) > 0;
if l_cnt > 0 then
l_pos := 1;
SELECT xml_clob
INTO l_clob
FROM AUDIT_XML_CLOB where case_id = c2.case_id;
l_fHandler := UTL_FILE.FOPEN('MY_DIR1', 'test.xml','W',c_amount);
l_clobLen := DBMS_LOB.GETLENGTH(l_clob);
WHILE l_pos < l_clobLen
LOOP
l_buffer := DBMS_LOB.SUBSTR(l_clob, c_amount, l_pos);
EXIT WHEN l_buffer IS NULL;
UTL_FILE.PUT_line(l_fHandler, l_buffer,TRUE);
l_pos := l_pos + LEAST(LENGTH(l_buffer)+1,c_amount);
dbms_output.put_line('l_pos:'||l_pos);
UTL_FILE.FFLUSH (l_fHandler);
END LOOP;
UTL_FILE.FCLOSE(l_fHandler);
l_message_num := l_message_num +1;
end if;
end loop;
commit;
dbms_output.put_line('4');
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(l_fHandler) THEN
UTL_FILE.FCLOSE(l_fHandler);
END IF;
--RAISE;
l_err_msg:= substr(sqlerrm,1,3000);
dbms_output.put_line(l_err_msg);
END;
/
【问题讨论】:
【参考方案1】:1) 将 clob 转储到新文件的快速方法是使用 DBMS_XSLPROCESSOR.clob2file(...) 2)你的xml有什么问题?
begin
for c2 in ( SELECT xml_clob , case_id FROM AUDIT_XML_CLOB where case_id = '2006S1000018')
loop
dbms_xslprocessor.clob2file(CL=> c2.xml_clob, FLOCATION=>'MY_DIR1', FNAME=>'test.xml', CSID=>0);
end loop;
end;
MY_DIR1 所在的位置,您有权在此位置写入。
【讨论】:
在下载的 XML 文件中省略了一些标签 你能告诉我如何在上面的代码中使用dbms_xlsprocessor.clob2file吗?以上是关于无法从 CLOB 列写入正确的 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 从 CLOB 列转换为 XMLType 列时出错
通过 talend 从 oracle 加载到 greenplum 时的数据不能很好地处理 CLOB 列