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 中,这样您就可以处理循环并更改 值。

希望这会有所帮助,[]

干杯