【发布时间】:2011-02-28 17:37:07
【问题描述】:
我想使用 PHP 将 (key1, key2) 数组传递/绑定到 Oracle PL/SQL 存储过程。我能够绑定原始类型和原始类型数组,但还没有找到来回传递复杂数据类型的方法。
这是不受支持的吗?到目前为止,我不得不传递多个数组——一个用于我复杂类型中的每个子类型的数组——然后依靠它们的索引在过程中重构它们。
【问题讨论】:
我想使用 PHP 将 (key1, key2) 数组传递/绑定到 Oracle PL/SQL 存储过程。我能够绑定原始类型和原始类型数组,但还没有找到来回传递复杂数据类型的方法。
这是不受支持的吗?到目前为止,我不得不传递多个数组——一个用于我复杂类型中的每个子类型的数组——然后依靠它们的索引在过程中重构它们。
【问题讨论】:
似乎不支持。 oci_bind_array_by_name() 和 oci_bind_by_name() 似乎只能传递原始类型。 documentation 没有显示任何其他可能性。
共享对象/结构/复杂类型并不容易,因为不同语言中对象的表示可能彼此相距甚远。例如,memcached 允许存储来自任何语言的对象,该语言具有将对象从其自己的表示形式转换为 memcached 表示形式的库,反之亦然。
如果 oci8 在 PHP 哈希/对象与 PL/SQL 中的复杂类型之间有一个转换器,您可以做到这一点,但事实并非如此。
您只需对oci_bind_by_name() 进行多次调用,然后为您的散列/复杂类型的每个键使用尽可能多的参数来调用您的过程。
【讨论】:
为什么不将对象的状态序列化为 XML?
目前,将对象海化为 XML 是很常见的做法,这样它们就可以以与语言/平台无关的方式在 Web 上传递。为什么不这样做并将其作为 varchar 存储在数据库中。
注意:此方法的明显缺陷是您将无法以干净的方式通过对象的属性选择数据库中的字段,因为它将对象的多个属性混合在数据库的一个字段中.
如果您确实需要可搜索对象的属性,则需要将对象的每个属性中的数据分解到各自的字段中。
【讨论】:
JSON“更轻”,但我真的不清楚为什么有人想在 Oracle 中使用 JSON 并拥有 Oracle XML 处理能力和 XML DB 的强大功能。序列化讨论消失了,因为 Oracle 可以将 XML“分解”到关系表中以获得高性能和可访问性,而无需开发人员编写一行代码(并且也不必依赖未经验证的 json 项目)——并且同样可以透明地将其检索为 XML。
另一个观察结果是,如上所述,保持“与数据库无关”虽然可移植,但极大地限制了开发人员利用当今数据库引擎提供的强大功能的能力。
我知道这篇评论“迟到了”,但是在上述答案发布时,这些陈述在 Oracle 10g 中都是正确的,我相信人们仍然面临这个特殊的挑战
我强烈建议所有使用 PHP 和 Oracle 的人使用 XML 并利用 Oracle 令人难以置信的 XML 处理功能。
【讨论】: