免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3850|回复: 5
收起左侧

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

[复制链接]

324

主题

56万

铜板

1172

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
349368

宣传勋章爱心勋章组织勋章官方团队冰雪节勋章

发表于 2020-9-22 15:00 | 显示全部楼层 |阅读模式

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

不只是结构需要保持一致,还有用户、表空间、约束、备注等也需要一并带过去。如此一来,用“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来实现。

本文转载来自CSDN作者fmechina  版权归作者所有

原文链接:https://blog.csdn.net/fmechina/article/details/107690967



10

主题

2万

铜板

34

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4395

精华勋章灌水勋章活跃勋章贡献勋章

发表于 2020-9-22 15:28 | 显示全部楼层
谢谢分享
回复

使用道具 举报

141

主题

982万

铜板

3万

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
621915
发表于 2020-9-22 16:19 | 显示全部楼层
谢谢亲的分享!
回复 支持 反对

使用道具 举报

地信网友  发表于 2020-9-22 17:26
谢谢楼主分享!

0

主题

3万

铜板

9

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4457
发表于 2021-12-6 14:38 | 显示全部楼层
谢谢分享
回复

使用道具 举报

30

主题

2万

铜板

59

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6290
QQ
发表于 2023-3-16 17:29 | 显示全部楼层
:zt:zt:zt:zt
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表