加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于巧妙使用DB2系统视图SYSCAT.TABLES,SYSCAT.COLUMNS的应用

(2013-09-19 17:04:48)
标签:

syscat.tables

syscat.columns

load

export

import

分类: 数据库类

需求:1.由于我们有2台服务器SEVER A 和SERVER B,日常我们都将在SEVER A机子SCHEMA=AIS上加载数据,

        但希望SEVER B上也需要将有数据的表加载

      2.SERVER A与SERVER B两台机子上对应表的结构的列顺序不一致

分析:1.由于在SERVER A上的各个表的数据文件已经无法找到,这时我们就需要将SERVER A机器上的数据

        卸出来加载到SERVER B中     

      2.SERVE A与SERVER B两台机器的列顺序不一致,因此需要对表进行指定列加载

 

执行步骤如下:

 

      1.由于批量将SERVER A表中的数据卸数变成文件,因此利用系统表SYSCAT.TABLES及SYSCAT.COLUMNS

        系统视图拼出EXPORT语句

      2.假设表TABLEA的列为(id int,name varchar(100),sex varchar(2)),其EXPORT语句为:   

        EXPORT TO  ./TABLEA.del of del select  

                                        id 

                                       ,name   

                                       ,sex   

                                       from TABLEA

     3.根据2中的EXPORT语法,因此我们将需要拼出3段语句出来,第一段:EXPORT TO  ./TABLEA.del of  

       del select和第段: from TABLEA我们  可以根据SYSCAT.TABLES中拼出,中间的列信息使用  

       SYSCAT.COLUMNS中得出,然后使用UNION ALL 连接,如下所示: 

      db2 -o -x "  select aa from

     select tabname,colno,case when colno<>0 then ', ' else '  ' end || colname aa 

             from syscat.columns A where tabschema='AIS' AND TABNAME LIKE 'S04%' AND EXISTS

        (SELECT * FROM syscat.tables B WHERE A.TABNAME=B.TABNAME AND CARD>0 AND tabschema='AIS' )

      union all       

       select tabname,-1,'export to  ./'||tabname||'.del  of del  select '  from syscat.tables

           where tabschema='AIS' AND TABNAME LIKE 'S04%'  AND CARD>0         

      union all       

       select tabname,9999,'from  '||tabname ||'@'  from syscat.tables

           where tabschema='AIS'  AND TABNAME LIKE 'S04%' AND CARD>0

      ) B  order by tabname,colno  ">export.sql

 

  注:1.由于3个SQL使用UNION ALL拼出后的结果就三块,如需得到2中的结果将需要按表名及对应的列序号排

        

       select tabname,-1,'export to  ./'||tabname||'.del  of del  select '  from  syscat.tables 

           where tabschema='AIS' AND TABNAME LIKE 'S04%'  AND CARD>0

       这句SQL是每张表的抬头而SYSCAT.COLUMNS中的列号都是从0开始的,因此给它赋值“-1”,同样第3个语

       句是因为没有含有9999字段的表,赋值这个将在表的最后   

     2.由于每个表中的第一列不需要拼出逗号,因此使用了CASE WHEN判断,若colno=0,则直接拼空,否则拼

       逗号       

     3.需要将拼出的语句放在一个文本中,然后执行此SQL文本即将各个表的数据卸载出来

      (使用db2 -td@ -v -f命令) ,因此需要将每个SQL命令指定分隔符(这个分隔符可自定义)

     4. db2 -td @ -v -f export.sql

     5.在SERVER A中拼出load语句:

       db2 -o -x "  select aa from

         

     select tabname,colno,case when colno<>0 then ', ' else '  ' end || colname  aa

        from syscat.columns A  where tabschema='AIS'  AND TABNAME LIKE 'S03%' AND 

          EXISTS(SELECT * FROM syscat.tables  B WHERE A.TABNAME=B.TABNAME AND CARD>0 

            AND tabschema='AIS' )                  

     union all                    

     select tabname,-1,'load from   ./'||tabname||'.del  of del savecount 10000

       insert  into  '||tabname||'('  from syscat.tables  where tabschema='AIS' AND TABNAME

        LIKE 'S04%'  AND CARD>0                   

    union all             

     select tabname,9999,')  ' ||' nonrecorverable @' from syscat.tables

       where tabschema='AIS'  AND TABNAME LIKE 'S04%' AND CARD>0

    ) B  order by tabname,colno" >load.sql

    6.将load.sql文件与执行4后生成的数据文件传到server B中

    7.执行import.sql文件进行加载数据   

     db2 -td@ -v -f load.sql 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有