代码之家  ›  专栏  ›  技术社区  ›  cmdematos.com

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

  •  2
  • cmdematos.com  · 技术社区  · 15 年前

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

    所以,与其有“保存发票”的业务流程,不如这样……

    1. 启动事务
    2. 创建发票抬头
    3. 对于发票行项目
      1. 创建发票行项目
    4. 提交事务

    …相反,我希望传递到表示发票的数据库结构化数据中。

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

    1. 解析XML
    2. XML验证
    3. oracle pl/sql对象的参数提取与绑定

    当然,在任何情况下,无论解决方案如何,都必须这样做。但是,我不想支付XML文档罚款(尖括号税)。

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

    我想听听那些支持json、atom或其他格式的人的意见。

    还要考虑本机或二进制机制来实现这一点。如何构造和发送Oracle表(内存数据集)?以前有人做过吗?你的经历呢?

    6 回复  |  直到 9 年前
        1
  •  1
  •   Erich Kitzmueller    15 年前

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

    • 在知道数据库结构的客户机上使用dao
    • 使用存储过程使您有一点抽象
    • 使用XML

    任何其他结构化文本格式(json等)都是次等的,因为xml是 这个 在Oracle中,您已经有了一个解析器。

        2
  •  0
  •   Quassnoi    15 年前

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

    INSERT
    INTO    dest_table
    SELECT  *
    FROM    TABLE(:mycollection)
    
        3
  •  0
  •   Aaron Digulla    15 年前

    那要看情况。您可以以任何形式将数据存储为LoB。没有人这样做的主要原因是将数据存储在数据库中,这样就可以。 搜索 通过它。互联网是一个好主意,直到谷歌来,并使之成为可能。 找到 东西。

    所以你必须以某种方式分析数据。您可以在客户端上解析它,并发送SQL插入/更新。如果你用你喜欢的OO语言做这个,你会有一个或映射器(它可以在普通SQL表中加载和保存“对象”)。这样,在许多客户机上完成了繁重的工作(解析),而数据库只是存储和搜索数据。

        4
  •  0
  •   Vladimir Dyuzhev    15 年前

    我想通过让应用程序将数据库视为一个服务,从应用程序层抽象出一个大型数据库存储(relational,oltp)。

    刀层就是为了这个。对于应用程序代码,dao是一个持久层(按您的说法是服务)。dao知道如何存储结构化文档。

    我认为您必须对存储的文档执行sql查询。

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

        5
  •  0
  •   Matthieu M.    15 年前

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

    这可能是因为我们在工作中使用了非常重的数据库,所以我的观点是主观的,但是基本上可以在数据库之外做的任何事情都是在外部进行的,因为数据库对于大多数应用来说是一个瓶颈(并且‘外部’可以很容易地并行化)。

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

    | ID索引1索引2索引3…|大数据块|

    基本上,索引允许搜索,“大数据块”由应用程序控制。它通常是压缩的序列化(版本化)数据(有些团队在此blob;中存储大约300kb)。

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

    它工作得很好,…但正如我所说的,数据库是我们的瓶颈,所以我们尽量将负载外部化。

        6
  •  0
  •   PaulJ    15 年前