将结构化数据传入和传出Oracle的最佳(最快,最简单,最有效)方法是什么

时间:2009-10-05 13:31:09

标签: xml oracle

我想通过让应用程序将数据库视为服务来从应用程序层抽象大型数据库存储(关系,OLTP)。这样做的自然方式是调用sprocs,但传统上它们遵循CRUD范例,并且与我的抽象思维保持一致,我想抽象出数据库中所有数据结构的知识,并专注于业务流程。

所以没有“保存发票”的业务流程,而不是......

  1. 开始交易
  2. 创建发票标题
  3. 对于发票行项目
    1. 创建发票行项目
  4. 提交交易
  5. ...而是我想传递代表发票的数据库结构化数据。

    我可以传递包含发票的XML文档,但这是我想在数据库端避免的:

    1. 解析XML
    2. XML验证
    3. 参数提取和绑定到Oracle PL / SQL对象
    4. 当然,在所有情况下,无论解决方案如何,都必须这样做。但是,我不想支付XML文件惩罚(角括号税)。

      因此,问题是 - 将数据发送和接收并构建到Oracle存储过程的最有效方法是什么?

      我想听听那些想要争论JSON,ATOM或其他格式的人。

      还要考虑使用本机或二进制机制来实现此目的。如何在Oracle表(内存数据集)中构建和发送?有没有人这样做过?你的经历在哪里?

6 个答案:

答案 0 :(得分:1)

由于您使用Oracle,因此在存储过程中解析XML并不是什么大问题。国际海事组织只有三种明智的方法:

  • 在了解数据库结构的客户端上使用DAO
  • 使用存储过程以便进行一些抽象
  • 使用XML

任何其他结构化文本格式(JSON等)都是次等的,因为XML是 格式,您已经在Oracle中拥有解析器。

答案 1 :(得分:0)

您可以创建一个集合,在客户端填写它,将其传递到Oracle过程并使用它进行基于集合的操作:

INSERT
INTO    dest_table
SELECT  *
FROM    TABLE(:mycollection)

答案 2 :(得分:0)

这取决于。您可以将任何形式的数据存储为LOB。没有人这样做的主要原因是您将数据存储在数据库中,以便您可以搜索。互联网是一个不错的主意,直到Google出现并且能够找到的东西。

所以你必须以某种方式解析数据。您可以在客户端上解析它并发送SQL插入/更新。如果使用您喜欢的OO语言执行此操作,您将拥有OR映射器(可以在纯SQL表中加载和保存“对象”)。这样,繁重的解析(解析)在许多客户端上完成,而数据库只是存储和搜索数据。

答案 3 :(得分:0)

  

我希望通过让应用程序将数据库视为服务来从应用程序层抽象大型数据库存储(关系,OLTP)。

这就是DAO层的用途。对于应用程序代码,DAO是一个持久层(在您的术语中服务)。 DAO知道如何存储结构化文档。

我认为你必须对存储的文件进行SQL查询。

虽然存在特定于Oracle的XML格式,但我不会使用它,因为它将您的代码与Oracle绑定在一起。只要标准SQL有效,就使用它。

答案 4 :(得分:0)

我不明白为什么要对数据库进行“解析”和“验证”等操作。

可能我们在工作中使用负载很重的数据库,所以我的观点有点主观,但基本上可以在数据库之外完成的任何事情都是在外部完成的,因为数据库是大多数应用程序的瓶颈(和“外部”可以很容易地并行化。)

以下是我们在工作中使用的内容:

| ID |指数1 |指数2 |指数3 | ...... |大量数据|

基本上,索引允许搜索,“Big Blob of Data”在应用程序的控制之下。它通常是压缩的序列化(版本化)数据(一些团队在这个blob中存储大约300KB)。)。

当然,这需要前端(或库)以统一的方式实际执行序列化+压缩或解压缩+反序列化。

效果很好,但是正如我所说的数据库是我们的瓶颈,所以我们尽可能地将负载外部化。

答案 5 :(得分:0)