PHP和Oracle可以相互传递复杂类型吗?

PHP和Oracle可以相互传递复杂类型吗?,php,oracle,plsql,oci8,Php,Oracle,Plsql,Oci8,我想使用PHP将key1、key2数组传递/绑定到Oracle PL/SQL存储过程。我能够绑定基元类型和基元类型的数组,但还没有找到来回传递复杂数据类型的方法 这是不受支持的吗?到目前为止,我必须传递多个数组——我的复杂类型中的每个子类型一个数组——然后依靠它们的索引在过程中重新组合它们。似乎不受支持。oci_bind_array_by_name和oci_bind_by_name似乎只能传递基元类型。没有显示任何其他可能性 共享对象/结构/复杂类型并不容易,因为不同语言中对象的表示形式可能彼此

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

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

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

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

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

您只需按名称多次调用oci_bind_,就可以使用哈希/复杂类型的每个键所需的参数调用您的过程。

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

目前,将对象序列化为XML是一种非常常见的做法,这样它们就可以以与语言/平台无关的方式在web上传递。为什么不做同样的事情并将其作为varchar存储在数据库中呢

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


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

根据Evans的建议,我建议使用JSON。和都可以对JSON进行编码/解码,而且它的详细程度大大低于XML


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

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

另一个观察结果是,如上文所建议的,保持数据库不可知性,同时保持可移植性,极大地限制了开发人员利用当今数据库引擎提供的强大功能的能力

我知道这篇评论很晚才发表,但是在上面的回答中,这些陈述在Oracle 10g中都是正确的,我相信人们仍然面临着这个特殊的挑战


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

鉴于PHP/OCI8显然不支持传递复杂数据类型,这是一个好主意。我认为我可以使用XML作为将数据传递给过程的语言,但会在过程中解析数据,并在该过程之后将其视为以该格式到达,而不是直接将XML插入表中。