span8
span4
有很多方法可以“让您的数据库完成工作”,我们来看看如何使用FME更有效地执行对Oracle的写操作。
当使用FME写入数据库时,如果违反表上的约束,就可能发生错误。约束是限制数据库中某个列的可能值的规则。典型的约束包括非空、惟一和键(主键和外键)。下面概述的练习将介绍一种方法,用于处理由外键连接的表的写入导致的加载失败。
虽然这个练习使用了甲骨文数据库,讨论的概念和方法可以应用到其他数据库如PostgreSQL/PostGIS,SQL Server。
这个练习的目的是显示向具有约束(例如外键约束)的数据库表写入的选项。在本例中,您将加载一个水管网络(WMAINS),并创建一个具有管道制造商属性的资产表(WASSETS)。这两个表通过外键约束(称为WMAIN_WASSETS)相关联。
运行工作空间
1.打开工作空间:DatabaseWrite-Start.fmw。运行它。
工作空间正在向Oracle中两个连接的表写入数据。父表(WASSETS)的主键是MANUFACTURERID,子表(WMAIN)的主键是MAINID,外键是MANUFACTURERID。
工作空间失败抛出以下错误:
执行语句' INSERT INTO "WMAIN" ("MAINID", "ENABLED",…) VALUES (:"MAINID",:"ENABLED",…)'未成功;错误是' ORA-02291:违反了完整性约束(WMAIN_WASSETS) -未找到父键'。(serverType = '在' serverName = '”,用户名= ' ”,密码=‘* * *’,dbname = ")
发生错误是因为违反了WMAIN表上的外键约束(称为WMAIN_WASSETS)。为了满足约束,您必须在写入具有外键的子表之前写入父表。
下面的示例演示了处理此问题并写入相关表的不同方法。
例1 -使用FeatureHolder
FeatureHolder用于保存指向子表(WMAIN)的特性。由于只有很少的特性被写入到父表(WASSETS),所以它能够在FeatureHolder发布特性之前完成写入。这有效地阶段工作流程。亚搏在线
1.在运行此示例之前,需要清理数据库表。使用SQLCreator转换器删除并重新创建表。打开transformer属性,选择SQL语句并选择Run…然后取消以退出transformer属性。
2.添加一个FeatureHolder在WMAIN表之前。
3.运行工作区并检查日志文件和结果。
FeatureHolder对于功能数量较少的工作空间非常有用。如果有大量记录被写入表并保存在FeatureHolder中,那么它将影响整体性能。
例2 -使用连接运行时顺序
您可以使用Connection Runtime order选项来控制退出转换器的特性的顺序。本例使用连接运行时顺序来确保首先插入父记录。
1.在运行此示例之前,需要清理数据库表。使用SQLCreator转换器删除并重新创建表。打开transformer属性,选择SQL语句并选择Run…然后取消以退出transformer属性。
2.从前面的步骤中删除FeatureHolder转换器。
3.通过右键单击退出AttributeManager的输出连接器之一来设置连接运行时顺序。确保首先连接WASSET。这将确保在相应的WMAIN记录之前插入WASSET记录,确保满足WMAIN约束。
4.将每个事务的特性设置为1。您必须使用1的转换间隔来确保在插入WMAIN记录之前提交了WASSETS记录。
5.运行转换。
正如您所看到的,将事务间隔设置为1对性能有很大的影响,因为要对编写的每个特性执行提交。它确保在将记录写入子表之前将记录写入父表。
例3 -使用FeatureWriter
FeatureWriter转换器是编写数据的另一种方式。将写操作移到工作空间工作流中可以使您在编写功能类型的顺序以及如何对数据进行预处理和后处理方面亚搏在线具有更大的灵活性。
在本例中,您将使用SQL调用来禁用和启用WMAIN_WASSETS外键约束。在这之间,您将加载数据。
1.使用上面示例2中描述的SQLCreator删除并创建表,这样就可以从头开始了。
2.禁用或删除Oracle写入器。
3.为Oracle数据库添加一个SQLCreator,并添加以下SQL语句:
FME_SQL_DELIMITER;修改表“WMAIN”禁用约束WMAIN_WASSETS;
SQLCreator是在任何FME读取器打开之前执行的,因此可以保证在编写任何功能之前删除约束。
4.向工作区画布添加一个功能编辑器。打开FeatureWriter参数对话框。选择Oracle空间格式并选择数据集。
5.使用Oracle非空间格式导入Oracle表、WMAIN和WASSETS。
6.如步骤7所示,连接FeatureWriter。特性类型的顺序并不重要,因为我们禁用了约束。
7.为您的Oracle数据库添加一个SQLExecutor,并添加以下SQL:
FME_SQL_DELIMITER;改变表“WMAIN”启用约束WMAIN_WASSETS;
8.运行工作区并检查结果。
每个例子的优点和缺点是什么?也许每种方法都更适合不同的场景和表约束,如1:M M:N等。
哪个表现最好?可以用性能换取简单性吗?
哪个例子最适合更新工作流?亚搏在线
还有其他方法吗?
如果出现错误,哪种方法的恢复最容易?
的AttributeValidator可用于在加载之前检查所支持的条件。这让用户有机会看到并纠正任何可能导致写失败的特性。
©2019安全亚搏在线软件公司法律