PHP和Oracle能否将复杂类型相互传递?

时间:2010-06-07 14:13:32

标签: php oracle plsql oci8

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

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

4 个答案:

答案 0 :(得分:3)

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

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

如果oci8在PHP哈希/对象到PL / SQL中的复杂类型之间有转换器,那么你可以这样做但是情况并非如此。

您可以对oci_bind_by_name()进行多次调用,因此可以根据哈希/复杂类型的每个键所需的参数调用您的过程。

答案 1 :(得分:2)

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

目前,将对象作为XML进行搜索是非常常见的做法,因此它们可以以语言/平台无关的方式传递到Web上。为什么不这样做并将其作为varchar存储在数据库中。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

另一个观察是,如上所述保持“数据库不可知”,同时便携,严重限制了开发人员利用当今数据库引擎提供的强大功能的能力。

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

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