飞艳小屋

程序--人生--哲学___________________欢迎艳儿的加入

BlogJava 首页 新随笔 联系 聚合 管理
  52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks

现有主表(销售人员表),次表(销售明细表),请写一存储过程把这两表的数据导出指定格式的XML文件(格式如下),要求存储过程参数包括:数据库服务器名、数据库名、数据库用户名、数据库密码、导出文件完整路径。


<?xml version="1.0" encoding="GBK"?>
<data version="1.0" >
<!--第一位销售员销售明细开始-->
  <!--主表开始 -->
  <main>
  <id>p1</id>
  <name>张三</name>  
  </main>
  <!--主表结束 -->
  <!--明细表开始 -->
  <detail>
 <ID>c1</ID>
  <ParentID>p1</ParentID>
  <productname>产品1</productname>
  </detail>

  <detail>
  <ID>c2</ID>
  <ParentID>p1</ParentID>
  <productname>产品2</productname>
  </detail>
   <!--明细表结束 -->
<!--第一位销售员销售明细结束-->
 
<!--第二位销售员销售明细开始-->
  <!--主表开始 -->
  <main>
  <id>p2</id>
  <name>李四</name>  
  </main>
  <!--主表结束 -->
  <!--明细表开始 -->
  <detail>
 <ID>c3</ID>
  <ParentID>p2</ParentID>
  <productname>产品3</productname>
  </detail>

  <detail>
  <ID>c4</ID>
  <ParentID>p2</ParentID>
  <productname>产品4</productname>
  </detail>
   <!--明细表结束 -->
<!--第二位销售员销售明细结束-->
</data>


答案:
--销售明细xml生成存储过程

CREATE procedure pageer_rnewlist
(
 @hostname varchar(50),    --主机IP
 @dbname varchar(50),      --数据库名
 @username varchar(50),    --用户名
 @password varchar(50),    --密码
 @xmlpath varchar(50)      --xml输出路径
)

begin

--数据库登陆
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB',@hostname
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,@username,@password

go
declare @errorInfo varchar(200)             --错误信息

declare @tempSQL    varchar(1000)
--人员信息游标创建
set @tempSQL = ' declare idCursor cursor for '+ CHAR(13) + CHAR(10)
set @tempSQL =  @tempSQL +
               ' select a.id id,
                        a.name name,
                        b.id did,
                        b.productname pname
                 from 销售人员表 a,销售明细表 b
                 where
                        b.id = a.parentid
                        order by a.id '
EXEC (@tempSQL)

--创建全局临时表
create table ##tb(re varchar(8000))
INSERT INTO ##tb

--插入头信息
select '<?xml version="1.0" encoding="GBK"?>
        <data version="1.0" >'
INSERT INTO ##tb

--打开游标
OPEN idCursor;
    IF(@@CURSOR_ROWS = 0 )
      BEGIN
        CLOSE idCursor
        DEALLOCATE idCursor
        set @errorInfo = '没有指定表名或存储过程名!'
        print @errorInfo
        return
      END 

      declare @id  VARCHAR2(50) = '';

      FETCH NEXT FROM CUR_COUNID INTO CUR_COUNID;
      WHILE  (@@FETCH_STATUS <> -1)
      BEGIN
                --判断是否存储过的id
                IF CUR_COUNID.id <> @id THEN
                  --主表xml生成
                  SELECT '<main>'
                         '<id>'+CUR_COUNID.id+'</id>'
                         '<name>'+CUR_COUNID.name+'</name>'
                         '</main>';
                  INSERT INTO ##tb
                ELSE
                END IF;
                --明细xml生成               
                SELECT '<detail>'
                       '<ID>'+CUR_COUNID.did+'</ID>'
                       '<ParentID>'+CUR_COUNID.id+'</ParentID>'
                       '<productname>'+CUR_COUNID.productname+'</productname>'
                       '</detail>';
                INSERT INTO ##tb
                --保存当前记录id
                @id = CUR_COUNID.id;
        FETCH NEXT FROM CUR_COUNID INTO CUR_COUNID;
        END
        CLOSE idCursor
        DEALLOCATE idCursor

        --生成xml
        exec master..xp_cmdshell 'bcp ##tb out ' + @xmlpath
        drop table ##tb

        --删除链接服务器  
        exec   sp_dropserver   'srv_lnk','droplogins'
end


 

posted on 2007-04-30 09:22 天外飞仙 阅读(1051) 评论(0)  编辑  收藏 所属分类: Oracle

只有注册用户登录后才能发表评论。


网站导航: