ODI:从 XML 文件加载数据并插入 Oracle 数据库
ODI: Load Data from XML file & insert into Oracle Database
我是 ODI(Oracle 数据集成器)11g 的新手。我有 XML 个文件。我需要将该 XML 文件中的数据加载到 Oracle 数据库中。我创建了项目,导入了知识模块,创建了 XML & Oracle 模型。
注意:我的 XML 文件由 40 多个 table 组成。
目标数据存储目前仅存储 1 table。
这是我的会话日志:
编辑
根据评论,这是一种加载多个 "same xsd" xml 文件的方法。
首先,您必须确保所有 XML 确实具有相同的 XSD 结构,否则您可能会遇到奇怪的行为。
要处理多个 XML 文件,基本上这就是您必须做的:
1) 您给出一个特定的固定 XML 名称,并基于它创建您的拓扑。
2) 创建一个"file processing control" 在读取前重命名和移动文件。
3) 确保执行正确的 "synchronizing" 命令
例子
您有 XML 个文件:
/path/in/XML001.XML
/path/in/XML002.XML
/path/in/XML003.XML
将其中一个文件保存为 XML_DATA.xml,并在某个“/work/”路径中使用 XML_DATA.xml 设置拓扑,通过测试验证一切正常。
处理一个循环,其中:
1) 将/path/in/XML001.XML移动到/path/work/XMLDATA.XML(覆盖或删除旧的XMLDATA)
2) 执行"SYNCHRONIZE FROM FILE"
3) 处理你的接口
4) 执行"SYNCHRONIZE FROM DB"
5) 将已处理的 XML 移动到“/path/processed/”
你的包裹会是这样的:
[循环] > [MoveFile] > [ProcedureSync] > [接口] > [ProcedureSync] > [MoveFile] > [EndLoop]
关于循环控制,有几种方法可以实现,如果你有疑惑我可以给你提示。
希望对您有所帮助!
编辑 2
根据新的信息,我将尝试对所提出的问题进行更好的解释。这不是一个多么困难的任务,但对于仍在了解 ODI 工具的人来说可能听起来很难。
要点是要了解对于 ODI,XML 文件就像数据库一样是数据源,而不是像 .csv 这样的文件。
- (问)如何创建文件处理控制?
- (A) 我所谓的 "file processing control" 是一种简单的机制,其中
您 "move/copy/delete" 您的 XML 文件通过文件夹。您可以使用打包工具 OdiFileCopy、OdiFileDelete 等来完成此操作
- (Q) 我对同步命令的理解不够。你能给我更多的细节吗?
- (A) 在 ODI 中使用 XML 文件时需要同步。
基本上,当 ODI 使用 XML 文件时,首先会将其加载到内存中。然后 ODI 创建一个锁定 XML 文件的 .lck 文件。什么时候
你完成你的包 XML 文件仍在内存中,所以你需要
到 "download" 它再次到文件并释放锁,而 ODI 确实
不要自己做。这是因为您应该能够 运行 作为
您认为适合您的加载过程的许多包, XML
文件仍然可用。所以当你完成后,你必须通知
您将不再使用 XML,通过 运行ning 从
数据库命令。
- 我应该创建 XML 技术拓扑还是文件技术拓扑?
还是两者?
- (A) 您不需要为文件创建拓扑,运行 包
文件工具。请记住,您必须为 "Generic" 文件创建 XML 拓扑。不要将拓扑设置为 OM135SVOD180624.xml,而应将其设置为 OMDATASOURCE.xml
- 我需要有关循环控制的更多详细信息
- (A)我会做更详细的描述。很不幸我
现在这里没有安装 ODI,否则我也会 post
一个例子。不过我觉得会比较容易理解。
1) 在处理 XML 个文件时使用同步的示例。
每当访问XML文件进行读写时,建议按以下方式进行:
- 运行 "SYNCHRONIZE FROM FILE" 命令,在 XML 的逻辑架构中
文件。您可以通过创建 ODI 过程、设置
technology 到 XML,将 Logical Schema 指向你
创建并写入 "command on target" window: SYNCHRONIZE
来自文件。
- 运行 读取或写入 XML 文件的 ODI 包或加载计划。
- 运行 "SYNCHRONIZE FROM DATABASE" 命令,在 XML 的逻辑架构中
文件。您可以通过创建 ODI 过程、设置
technology 到 XML,将 Logical Schema 指向你
创建并写入 "command on target" window: SYNCHRONIZE
来自数据库。
- 这里很容易找到完整的参考资料:https://docs.oracle.com/cd/E28280_01/integrate.1111/e12644/xml_file.htm#ODIKM534 在项目 5.6.1.2 中。
示例:
2) 文件处理控制
在Package里面,工具箱栏里面,有一个"File"工具栏,里面有很多有用的文件工具,比如复制,删除,移动,zip,解压等等。您需要"control"您正在阅读的文件、重命名等
这些工具你可以玩一下,它们很容易理解。
3) 循环控制
在 ODI 中,您可以使用包中的变量开发循环。有时您可以仅使用 odi Procedure 来处理循环,这取决于您的需要。根据我掌握的关于您的上下文的少量信息,我建议您先尝试使用变量。
所以这是一个处理循环 5 次的示例。
1) 创建一个数字变量。
2) 将其拖到包中,设置值为0。
3) 再次拖动,配置为Evaluation,条件设置为Equal to 5.
4) 拖动您拥有的任何 "test" 接口。
5) Link KO Link 到界面。使用评估变量时,KO 链接的作用类似于 "false" 条件。在我们的例子中,如果计数器小于 5,它将指向接口。
6) 再次拖动变量,这次不是设置固定值,而是设置增量为 1。这会将值加 1。
7) Link Evaluate 变量的最后一个变量。
因此,这将 运行 测试界面的 5 倍。我在互联网上找到了一张图片来说明这一点:
您可以在这里找到有用的信息“https://dzone.com/articles/odi-11g-implementing-loops" and "https://blogs.oracle.com/dataintegration/using-variables-in-odi:-creating-a-loop-in-a-package”。
最终包
归根结底,你的 "algorithm" 会是这样的:
1) 通过文件夹中的文件处理循环(这有点棘手,它可能需要一个 jython 代码,您可以在此处找到执行此操作的参考“https://blogs.perficient.com/2014/08/01/looping-through-files-in-a-folder-using-odi/”)
2) 移动第一个文件到/work/OMDATASOURCE.xml
3) 从数据库命令同步。
4) 处理您的接口
5) 从文件同步命令。
6) 将 OMDATASOURCE.xml 移至“/processed”或您创建的任何其他控件。
7) 处理下一个文件。您可能还想使用 table 控制一些内容,例如已读取的文件、已处理的文件等。
8) End Loop(使用我发的循环控制例子)
ODI 非常灵活和可扩展,您可以通过多种方式做任何事情。
注意事项
- 还有其他方法可以做到这一点。您可以在名称中设置一个变量
XML 文件。这样就不需要 "move and rename",
但是你仍然需要处理循环中的文件
获取所需文件参数的路径,或者至少
将它们放在 table 中,这样您就可以处理循环并更改
值。
希望这会有所帮助,[]
干杯
我是 ODI(Oracle 数据集成器)11g 的新手。我有 XML 个文件。我需要将该 XML 文件中的数据加载到 Oracle 数据库中。我创建了项目,导入了知识模块,创建了 XML & Oracle 模型。
注意:我的 XML 文件由 40 多个 table 组成。
目标数据存储目前仅存储 1 table。
这是我的会话日志:
编辑
根据评论,这是一种加载多个 "same xsd" xml 文件的方法。
首先,您必须确保所有 XML 确实具有相同的 XSD 结构,否则您可能会遇到奇怪的行为。
要处理多个 XML 文件,基本上这就是您必须做的:
1) 您给出一个特定的固定 XML 名称,并基于它创建您的拓扑。 2) 创建一个"file processing control" 在读取前重命名和移动文件。 3) 确保执行正确的 "synchronizing" 命令
例子
您有 XML 个文件:
/path/in/XML001.XML
/path/in/XML002.XML
/path/in/XML003.XML
将其中一个文件保存为 XML_DATA.xml,并在某个“/work/”路径中使用 XML_DATA.xml 设置拓扑,通过测试验证一切正常。
处理一个循环,其中:
1) 将/path/in/XML001.XML移动到/path/work/XMLDATA.XML(覆盖或删除旧的XMLDATA)
2) 执行"SYNCHRONIZE FROM FILE"
3) 处理你的接口
4) 执行"SYNCHRONIZE FROM DB"
5) 将已处理的 XML 移动到“/path/processed/”
你的包裹会是这样的:
[循环] > [MoveFile] > [ProcedureSync] > [接口] > [ProcedureSync] > [MoveFile] > [EndLoop]
关于循环控制,有几种方法可以实现,如果你有疑惑我可以给你提示。
希望对您有所帮助!
编辑 2
根据新的信息,我将尝试对所提出的问题进行更好的解释。这不是一个多么困难的任务,但对于仍在了解 ODI 工具的人来说可能听起来很难。
要点是要了解对于 ODI,XML 文件就像数据库一样是数据源,而不是像 .csv 这样的文件。
- (问)如何创建文件处理控制?
- (A) 我所谓的 "file processing control" 是一种简单的机制,其中 您 "move/copy/delete" 您的 XML 文件通过文件夹。您可以使用打包工具 OdiFileCopy、OdiFileDelete 等来完成此操作
- (Q) 我对同步命令的理解不够。你能给我更多的细节吗?
- (A) 在 ODI 中使用 XML 文件时需要同步。 基本上,当 ODI 使用 XML 文件时,首先会将其加载到内存中。然后 ODI 创建一个锁定 XML 文件的 .lck 文件。什么时候 你完成你的包 XML 文件仍在内存中,所以你需要 到 "download" 它再次到文件并释放锁,而 ODI 确实 不要自己做。这是因为您应该能够 运行 作为 您认为适合您的加载过程的许多包, XML 文件仍然可用。所以当你完成后,你必须通知 您将不再使用 XML,通过 运行ning 从 数据库命令。
- 我应该创建 XML 技术拓扑还是文件技术拓扑? 还是两者?
- (A) 您不需要为文件创建拓扑,运行 包 文件工具。请记住,您必须为 "Generic" 文件创建 XML 拓扑。不要将拓扑设置为 OM135SVOD180624.xml,而应将其设置为 OMDATASOURCE.xml
- 我需要有关循环控制的更多详细信息
- (A)我会做更详细的描述。很不幸我 现在这里没有安装 ODI,否则我也会 post 一个例子。不过我觉得会比较容易理解。
1) 在处理 XML 个文件时使用同步的示例。
每当访问XML文件进行读写时,建议按以下方式进行:
- 运行 "SYNCHRONIZE FROM FILE" 命令,在 XML 的逻辑架构中 文件。您可以通过创建 ODI 过程、设置 technology 到 XML,将 Logical Schema 指向你 创建并写入 "command on target" window: SYNCHRONIZE 来自文件。
- 运行 读取或写入 XML 文件的 ODI 包或加载计划。
- 运行 "SYNCHRONIZE FROM DATABASE" 命令,在 XML 的逻辑架构中 文件。您可以通过创建 ODI 过程、设置 technology 到 XML,将 Logical Schema 指向你 创建并写入 "command on target" window: SYNCHRONIZE 来自数据库。
- 这里很容易找到完整的参考资料:https://docs.oracle.com/cd/E28280_01/integrate.1111/e12644/xml_file.htm#ODIKM534 在项目 5.6.1.2 中。
示例:
2) 文件处理控制
在Package里面,工具箱栏里面,有一个"File"工具栏,里面有很多有用的文件工具,比如复制,删除,移动,zip,解压等等。您需要"control"您正在阅读的文件、重命名等
这些工具你可以玩一下,它们很容易理解。
3) 循环控制
在 ODI 中,您可以使用包中的变量开发循环。有时您可以仅使用 odi Procedure 来处理循环,这取决于您的需要。根据我掌握的关于您的上下文的少量信息,我建议您先尝试使用变量。
所以这是一个处理循环 5 次的示例。
1) 创建一个数字变量。
2) 将其拖到包中,设置值为0。
3) 再次拖动,配置为Evaluation,条件设置为Equal to 5.
4) 拖动您拥有的任何 "test" 接口。
5) Link KO Link 到界面。使用评估变量时,KO 链接的作用类似于 "false" 条件。在我们的例子中,如果计数器小于 5,它将指向接口。
6) 再次拖动变量,这次不是设置固定值,而是设置增量为 1。这会将值加 1。
7) Link Evaluate 变量的最后一个变量。
因此,这将 运行 测试界面的 5 倍。我在互联网上找到了一张图片来说明这一点:
您可以在这里找到有用的信息“https://dzone.com/articles/odi-11g-implementing-loops" and "https://blogs.oracle.com/dataintegration/using-variables-in-odi:-creating-a-loop-in-a-package”。
最终包
归根结底,你的 "algorithm" 会是这样的:
1) 通过文件夹中的文件处理循环(这有点棘手,它可能需要一个 jython 代码,您可以在此处找到执行此操作的参考“https://blogs.perficient.com/2014/08/01/looping-through-files-in-a-folder-using-odi/”)
2) 移动第一个文件到/work/OMDATASOURCE.xml
3) 从数据库命令同步。
4) 处理您的接口
5) 从文件同步命令。
6) 将 OMDATASOURCE.xml 移至“/processed”或您创建的任何其他控件。
7) 处理下一个文件。您可能还想使用 table 控制一些内容,例如已读取的文件、已处理的文件等。
8) End Loop(使用我发的循环控制例子)
ODI 非常灵活和可扩展,您可以通过多种方式做任何事情。
注意事项
- 还有其他方法可以做到这一点。您可以在名称中设置一个变量 XML 文件。这样就不需要 "move and rename", 但是你仍然需要处理循环中的文件 获取所需文件参数的路径,或者至少 将它们放在 table 中,这样您就可以处理循环并更改 值。
希望这会有所帮助,[]
干杯