我想使用 PHP 将 (key1, key2) 数组传递/绑定到 Oracle PL/SQL 存储过程。我能够绑定原始类型和原始类型数组,但还没有找到一种来回传递复杂数据类型的方法。
这是不受支持的吗?到目前为止,我不得不传递多个数组——一个用于我复杂类型中的每个子类型的数组——然后依靠它们的索引在过程中重构它们。
似乎不支持。oci_bind_array_by_name()
并且oci_bind_by_name()
似乎只能传递原始类型。该文档没有显示任何其他可能性。
共享对象/结构/复杂类型并不容易,因为不同语言中对象的表示可能彼此相距甚远。例如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 处理特性。