飛艷小屋

          程序--人生--哲學___________________歡迎艷兒的加入

          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 天外飛仙 閱讀(1106) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 大洼县| 深圳市| 长治市| 博湖县| 牟定县| 响水县| 梁河县| 定西市| 海林市| 菏泽市| 开江县| 杂多县| 巴彦淖尔市| 盐边县| 德庆县| 万宁市| 南召县| 普安县| 襄城县| 大城县| 宜黄县| 临城县| 亚东县| 盐津县| 苍山县| 哈巴河县| 昌吉市| 高唐县| 清镇市| 宁海县| 达州市| 洮南市| 安岳县| 麦盖提县| 永丰县| 衡山县| 贵定县| 塔城市| 丹东市| 沁阳市| 东乡县|