2010-06-07 107 views
3

我想使用PHP將(key1,key2)數組傳遞/綁定到Oracle PL/SQL存儲過程。我能夠綁定基本類型和基本類型的數組,但沒有找到一種方法來傳遞複雜的數據類型。PHP和Oracle可以將複雜類型傳遞給對方嗎?

這不支持?到目前爲止,我一直需要傳遞多個數組 - 一個用於我的複雜類型的每個子類型 - 然後依賴於它們的索引在過程中重新構建它們。

回答

2

爲什麼不將序列化對象的狀態爲XML?

目前,將對象作爲XML進行搜索是非常普遍的做法,因此它們可以以語言/平臺不可知的方式通過Web傳遞。爲什麼不這樣做,並將其作爲varchar存儲在數據庫中。

注意:此方法的明顯不足之處在於,您將無法通過對象的屬性以乾淨的方式選擇數據庫中的字段,因爲它在數據庫的一個字段中混合了對象的多個屬性。

如果您要需要可搜索對象的屬性,您需要將每個對象的屬性中的數據分解到各自的字段中。

+0

考慮到在PHP/OCI8中傳遞複雜數據類型明顯缺乏支持,這是一個好主意。我想我可能會使用XML作爲將數據傳遞給我的過程的語言,但會在過程中解析它並在該點之後對待它,就好像它以該格式到達(而不是直接將XML插入到表中)。 – 2010-06-23 19:21:59

3

似乎不支持。 oci_bind_array_by_name()oci_bind_by_name()似乎只能傳遞原始類型。 documentation不顯示任何其他可能性。

共享對象/結構/複雜類型並不容易,因爲不同語言中對象的表示可能彼此遠離。例如,memcached允許存儲任何語言的對象,該語言具有將對象從其自身表示轉換爲memcached的對象,反之亦然。

你可以這樣做,如果oci8有一個轉換器之間的PHP哈希/對象複雜類型在PL/SQL,但事實並非如此。

您只需撥打oci_bind_by_name()的幾個電話,然後根據您的散列/複雜類型的每個鍵的需要調用您的過程。

1

除了埃文斯的建議,我建議使用JSON。 PHPOracle都可以對JSON進行編碼/解碼,並且它比XML小得多。

無論你去哪裏,序列化都可能是要走的路。也就是說,我建議不要將原始JSON存儲在varchar字段中 - Oracle能夠(通過上面鏈接的工具)解釋JSON並生成JSON響應。

1

JSON是「更輕」,但我真的不清楚爲什麼任何人都希望在Oracle中使用JSON,並具有Oracle XML處理能力和XML DB的強大功能。序列化討論消失了,因爲Oracle可以將XML「分解」到關係表中,以實現高性能和可訪問性,而不需要開發人員編寫單行代碼(並且不必依賴未經驗證的json項目),並且同樣以XML的形式透明地檢索它。

另一個觀察結果是,如上所述,爲了保持「數據庫不可知性」,而且可移植性嚴重限制了開發人員利用當今數據庫引擎提供的強大功能的能力。

我知道,這種評論是「遲到」,然而這些語句都在上面的答案的時間在Oracle 10g中舉行真實,我敢肯定,人們仍然面臨着這個特殊的挑戰

我強烈推薦的所有使用PHP和Oracle的人都在使用XML並利用Oracle的令人難以置信的XML處理功能。

相關問題