利用FME去拼接SQL语句并创建表

 

在之前的工作中,我遇到了这么一个需求,需要将数据库内一千多个旧表按其原来表结构,重新创建对应的新表。然后对旧数据的进行处理后,存储新的数据。

不只是结构需要保持一致,还有用户、表空间、约束、备注等也需要一并带过去。如此一来,用“create table …… as select……”语句去创建,并不能把约束等,也保留过去,显然不符合要求。后来还是选择的用PL/SQL导出数据结构的方法。

不过这样这样处理又带来一个问题。要从源oracle数据库里,一共五六个用户的几万个表里面,人工挑选出这一千多张表,也是很费劲的一件事情。而且明显也不智能。

先看一下导出的表结构:

 

这里可以将其看作是一个格式化文本,每个创建表的语句都是以如下语句开始:

prompt

prompt Creating table ……

prompt =====================================

prompt

明白了这一点,我们就可以遍历所有的文本,然后将每个表的SQL语句都分离出来。于是,我偷了个懒,只做了一个大概的挑选,将大部分表的SQL都导出来了。

下一步就是用FME去格式化SQL语句

用Text File读模块读取SQL语句。然后创建一个type属性,代表每一个完整的SQL语句的。启用相邻要素属性,遍历要素,每当以“prompt ===========”开始,则type类型加一。

转换器参数设置如下:

转换结果如下:

虽然也将不同表的SQL语句分离了出来,不过这样的分类并不是完全正确的,如“prompt Creating table C1_320100_D_2000_DKG10”等语句,严格来说,需要是属于下一个SQL语句的,不过没关系,这些最终我们都不需要。直接用tester转换器清理掉。

然后再创建一个AttributeCreator转换器,提取出所有以“create table @UpperCase(@Value(用户名)). ”开始的语句,存放在一个新的属性tablename中,以便后期提取表名。

用Aggregator转换器以“type”为分组拼接成完整的SQL语句。效果如图下:

不过这并不是我要的那一千多个表,还需要进行处理,用StringReplacer,和AttributeCreator对之前保存的tablename属性进行处理,提取出完整的表名,和用户名。

最终结果如下:

如此,便对每一个SQL语句进行了格式化,而且包含主外键、表空间,用户、和备注等。

现在整个表已经算非常规整的数据了,与我需要的表名称和用户进行属性挂接就可以获得对应的SQL语句。(该表包含对应的数据库服务、用户、登录密码等)

 

 

然后将选择出来的SQL语句,输出到SQLExecutor转换器中,

 

不只是创建的SQL语句,在SQLExecutor转换器中,可以写任何DDL和DML语句,来进行数据的处理和事务的控制。

因为FME的特性,灵活利用SQLExecutor转换器,可以在数据库操作的时候避免很多重复且繁琐的工作。而又不需要去写复杂的SQL来实现。

 

 

 

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/107690967