飛艷小屋

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

          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 天外飛仙 閱讀(1108) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 岚皋县| 清丰县| 中卫市| 建湖县| 蒙自县| 安顺市| 壶关县| 龙胜| 芦溪县| 通海县| 陵川县| 灵石县| 社旗县| 石门县| 双流县| 达州市| 武陟县| 武穴市| 永安市| 桓台县| 乡宁县| 讷河市| 拉孜县| 田阳县| 兰溪市| 青河县| 灵山县| 滦南县| 攀枝花市| 开封县| 兰坪| 鄄城县| 麻栗坡县| 泌阳县| 加查县| 哈巴河县| 武宁县| 莱芜市| 德州市| 兴宁市| 保靖县|