【问题标题】:Can PHP and Oracle pass complex types to each other?PHP 和 Oracle 可以相互传递复杂类型吗?
【发布时间】:2011-02-28 17:37:07
【问题描述】:

我想使用 PHP 将 (key1, key2) 数组传递/绑定到 Oracle PL/SQL 存储过程。我能够绑定原始类型和原始类型数组,但还没有找到来回传递复杂数据类型的方法。

这是不受支持的吗?到目前为止,我不得不传递多个数组——一个用于我复杂类型中的每个子类型的数组——然后依靠它们的索引在过程中重构它们。

【问题讨论】:

    标签: php oracle plsql oci8


    【解决方案1】:

    似乎不支持。 oci_bind_array_by_name()oci_bind_by_name() 似乎只能传递原始类型。 documentation 没有显示任何其他可能性。

    共享对象/结构/复杂类型并不容易,因为不同语言中对象的表示可能彼此相距甚远。例如,memcached 允许存储来自任何语言的对象,该语言具有将对象从其自己的表示形式转换为 memcached 表示形式的库,反之亦然。

    如果 oci8 在 PHP 哈希/对象与 PL/SQL 中的复杂类型之间有一个转换器,您可以做到这一点,但事实并非如此。

    您只需对oci_bind_by_name() 进行多次调用,然后为您的散列/复杂类型的每个键使用尽可能多的参数来调用您的过程。

    【讨论】:

      【解决方案2】:

      为什么不将对象的状态序列化为 XML?

      目前,将对象海化为 XML 是很常见的做法,这样它们就可以以与语言/平台无关的方式在 Web 上传递。为什么不这样做并将其作为 varchar 存储在数据库中。

      注意:此方法的明显缺陷是您将无法以干净的方式通过对象的属性选择数据库中的字段,因为它将对象的多个属性混合在数据库的一个字段中.

      如果您确实需要可搜索对象的属性,则需要将对象的每个属性中的数据分解到各自的字段中。

      【讨论】:

      • 这是一个好主意,因为 PHP/OCI8 明显缺乏对传递复杂数据类型的支持。我想我可能会使用 XML 作为将数据传递给我的程序的语言,但会在程序中对其进行解析,并在此之后将其视为以该格式到达(而不是直接将 XML 插入表中)。跨度>
      【解决方案3】:

      根据 Evans 的建议,我建议使用 JSON。 PHPOracle 都可以对 JSON 进行编码/解码,并且比 XML 更简洁。

      无论您选择哪种方式,序列化都可能是您要走的路。也就是说,我建议不要将原始 JSON 存储在 varchar 字段中 - Oracle 能够(使用上面链接的工具)解释 JSON 并生成 JSON 响应。

      【讨论】:

        【解决方案4】:

        JSON“更轻”,但我真的不清楚为什么有人想在 Oracle 中使用 JSON 并拥有 Oracle XML 处理能力和 XML DB 的强大功能。序列化讨论消失了,因为 Oracle 可以将 XML“分解”到关系表中以获得高性能和可访问性,而无需开发人员编写一行代码(并且也不必依赖未经验证的 json 项目)——并且同样可以透明地将其检索为 XML。

        另一个观察结果是,如上所述,保持“与数据库无关”虽然可移植,但极大地限制了开发人员利用当今数据库引擎提供的强大功能的能力。

        我知道这篇评论“迟到了”,但是在上述答案发布时,这些陈述在 Oracle 10g 中都是正确的,我相信人们仍然面临这个特殊的挑战

        我强烈建议所有使用 PHP 和 Oracle 的人使用 XML 并利用 Oracle 令人难以置信的 XML 处理功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-11
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多