SQL查询结果导出XML文件简单的方法

注:此方法仅支持SQL2005

最近需要把数据导成XML,不想通过编程实现,手工使用导入导出工具又觉得麻烦,想想还是写SQL语句运行的好,以后扩展也方便,但Microsoft好像并没有提供什么SQL语句可以直接导出方法,用bcp导出的都是文本、EXCEL或其他什么的,本来以为可以把查询结果通过bcp导出文本的形式,但经过N次试验,导出的XML不知道为什么都会自动换行,一打开就会报错,百思不得其解,而且导出的XML没有一个<Root>,这也是个麻烦事。
最关键的就是这两个问题:1.如何使用XML不自动换行;2.如何增加一个<Root>标签;
查看了N篇与其相关的联机帮助,一个xml的数据类型提醒了我,觉得可以把查询结果做为一个变量存储后再导出,通过连接一个视图来增加<Root>标签,以下是样例代码:

USE Test
--创建一个表
CREATE TABLE Test_blan (x varchar(100), y varchar(100))
--插入数据
INSERT INTO  Test_blan  VALUES(...略...)
--创建一个视图用于增加<Root>标签
CREATE VIEW  AS SELECT 'root'  l
--创建一个表用于存储生成的XML结果
CREATE TABLE TT (aa xml)
--定义一个XML的变量
DECLARE @x xml
--查询生成XML结果并存储到TT表中
SET @x=( SELECT IRoot.l, IDate.x,IData.y FROM Test..Test_Log IRoot, Test..Test_blan IData FOR XML AUTO)
INSERT TT VALUES(@x)
--通过bcp将TT中的XML结果输出
EXEC master..xp_cmdshell 'bcp Test..TT out e:/123.xml -c -T -k'
--删除表及视图
DROP TABLE TT
DROP VIEW Test_Log

这样导出的XML就是个完整的文件了

 

在PL/SQL中将查询结果导出XML格式,可以通过以下步骤实现: 1. **使用`DBMS_XMLGEN.GETXML`函数生成XML数据** `DBMS_XMLGEN`包提供了从SQL查询结果生成XML的功能。可以使用`GETXML`函数将查询结果转换为CLOB类型的XML数据。 示例代码: ```plsql DECLARE l_xml CLOB; BEGIN -- 生成XML数据 l_xml := DBMS_XMLGEN.GETXML('SELECT * FROM your_table'); -- 输出XML内容(可选) DBMS_OUTPUT.PUT_LINE(l_xml); END; ``` 2. **将生成的XML数据写入文件** 使用`UTL_FILE`包将CLOB类型的XML数据写入到服务器上的文件系统中。需要先创建一个目录对象,并确保有权限访问该目录。 示例代码: ```plsql DECLARE l_xml CLOB; l_file UTL_FILE.FILE_TYPE; l_buffer VARCHAR2(32767); l_amount BINARY_INTEGER := 32767; l_pos INTEGER := 1; l_clob_len INTEGER; BEGIN -- 生成XML数据 l_xml := DBMS_XMLGEN.GETXML('SELECT * FROM your_table'); -- 打开文件 l_file := UTL_FILE.FOPEN('YOUR_DIRECTORY', 'output.xml', 'w', 32767); -- 获取CLOB长度 l_clob_len := DBMS_LOB.GETLENGTH(l_xml); -- 循环写入文件 WHILE l_pos <= l_clob_len LOOP DBMS_LOB.READ(l_xml, l_amount, l_pos, l_buffer); UTL_FILE.PUT(l_file, l_buffer); UTL_FILE.FFLUSH(l_file); -- 刷新缓冲区 l_pos := l_pos + l_amount; END LOOP; -- 关闭文件 UTL_FILE.FCLOSE(l_file); END; ``` 3. **释放资源** 如果使用了临时CLOB变量,建议调用`DBMS_LOB.FREETEMPORARY`来释放资源[^4]。 示例代码: ```plsql DBMS_LOB.FREETEMPORARY(l_xml); ``` 4. **注意事项** - 确保数据库用户具有`UTL_FILE`执行权限。 - `YOUR_DIRECTORY`是一个Oracle目录对象,指向实际的文件系统路径。 - 文件写入路径必须由数据库管理员预先定义并授权给用户。 - 处理中文字符时,注意字符集和缓冲区大小的兼容性问题[^4]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值