从这里开始是我正在努力完成的任务的更大图景 . 我需要根据特定SQL请求的结果创建一个xml文件,并将其存储在客户端计算机上的文件中 . 为此,我有一个使用xslt执行DBMS_XMLGen的SQL脚本,我将使用sqlplus从命令行运行并将输出传输到文件中 .
我现在遇到的问题是XML代码(存储在CLOB中)的内容必须分成较小的块用于DBMS_OUTPUT.PUT_LINE,并且每个块最终都有一个新的行字符,从而破坏了XML代码的结构 . 我想知道是否有办法在屏幕上打印BLOB的内容?
这是SQL脚本的示例:
SET SERVEROUTPUT ON FORMAT WRAPPED;
set feedback off
DECLARE
v_ctx DBMS_XMLGen.ctxHandle;
v_xml CLOB;
v_xslt CLOB;
l_offset number := 1;
BEGIN
v_ctx := DBMS_XMLGen.newContext('SELECT * FROM TABLE');
-- DBMS_XMLGen.setXSLT(v_ctx, v_xslt); --not relevant here
v_xml := BMS_XMLGen(v_ctx);
DBMS_XMLGen.closeContext(v_ctx);
loop exit when l_offset > dbms_lob.getlength(v_xml);
DBMS_OUTPUT.PUT_LINE (dbms_lob.substr( v_xml, 255, l_offset));
l_offset := l_offset + 255;
end loop;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM,1,255));
raise;
END;
/
除了每255个符号后的新行字符外,我得到的输出是正确的 . 我不能在以后删除行尾,我需要XML可读
有任何想法吗?
干杯,狮子座
4 回答
为什么不使用
DBMS_OUTPUT.PUT
而不是DBMS_OUTPUT.PUT_LINE
?试试看 . 诀窍是在打印内容后添加换行符 . 你可以通过调用DBMS_OUTPUT.NEW_LINE
来做到这一点 .在http://forums.oracle.com/forums/thread.jspa?threadID=306557上检查APC的CLOB解决方法是否为dbms_output
一种可能的方法是执行以下操作:
使用CLOB类型的单列和行创建数据库表 .
在服务器上,将生成的XML插入该表 .
在客户端上运行SQL * PLus脚本,如下所示:
这会将您的XML转储到file_name.xml之后,您需要通过发出以下命令来截断表:
否则即使您删除CLOB行,表也不会收缩 .
您可以添加分隔符并打印出254个字符,然后在记事本中(在扩展模式
~\r\n
中)替换此分隔符: