PHP を使用して、(key1, key2) の配列を Oracle PL/SQL ストアド プロシージャに渡したりバインドしたりしたいと考えています。プリミティブ型とプリミティブ型の配列をバインドできますが、複雑なデータ型をやり取りする方法が見つかりません。
これはサポートされていませんか? これまでは、複数の配列 (複合型のサブタイプごとに 1 つずつ) を渡してから、それらのインデックスに依存してプロシージャ内でそれらを再構成する必要がありました。
サポートされていないようです。oci_bind_array_by_name()
プリミティブ型しか渡せoci_bind_by_name()
ないようです。ドキュメントには、他の可能性は示されていません。
異なる言語でのオブジェクトの表現は互いに遠く離れている可能性があるため、オブジェクト/構造/複合型を共有することは容易ではありません。たとえば、memcached
オブジェクトを独自の表現から memcached の表現に、またはその逆に変換するライブラリを持つ任意の言語のオブジェクトを格納できます。
oci8 に PHP ハッシュ/オブジェクトと PL/SQL の複雑な型との間のコンバーターがあればそれを行うことができますが、そうではありません。
oci_bind_by_name()
ハッシュ/複合型の各キーに必要な数の引数を使用して、いくつかの呼び出しを行うことができます。
オブジェクトの状態を XML としてシリアライズしませんか?
現在、オブジェクトを XML としてシリアライズして、言語/プラットフォームにとらわれない方法で Web を介して渡すことができるようにすることは、かなり一般的な方法です。同じことをして、DBにvarcharとして保存してみませんか。
注: この方法の明らかな欠点は、オブジェクトの複数の属性をデータベースの 1 つのフィールドに混在させるため、オブジェクトの属性によってデータベース内のフィールドをきれいに選択できないことです。
オブジェクトの属性を検索可能にする必要がある場合は、オブジェクトの各属性のデータをそれぞれのフィールドに分割する必要があります。
JSONは「軽量」ですが、OracleXML処理機能とXMLDBを自由に使用できるPowerでOracleでJSONを使用したいと思う理由がわかりません。オラクルは、開発者が1行のコードを記述せずに(また、証明されていないjsonプロジェクトに依存することなく)、高性能とアクセシビリティのためにXMLをリレーショナルテーブルに「細断」でき、同様にXMLとして透過的に取得できるため、シリアル化の議論はなくなります。
もう1つの観察結果は、上記で推奨されているように「データベースにとらわれない」ままである一方で、移植性はあるものの、今日のデータベースエンジンが提供する非常に強力な機能を利用する開発者の能力を劇的に制限することです。
この解説が「遅い」ことは承知していますが、これらの記述はすべて、上記の回答の時点でOracle 10gに当てはまり、人々は依然としてこの特定の課題に直面していると確信しています。
PHPとOracleを使用するすべての人に強くお勧めするのは、XMLを使用し、OracleのすばらしいXML処理機能を利用することです。