Могут ли PHP и Oracle передавать сложные типы друг другу?


Я хочу передать/привязать массив (key1, key2) к хранимой процедуре Oracle PL/SQL с использованием PHP. Я могу связывать примитивные типы и массивы примитивных типов, но не нашел способа передавать сложные типы данных туда и обратно.

Это не поддерживается? До сих пор мне приходилось передавать несколько массивов - по одному для каждого подтипа в моем сложном типе - а затем зависеть от их индексов, чтобы воссоздать их в процедуре.

Author: aw crud, 2010-06-07

4 answers

Почему бы вам не сериализовать состояние объекта в формате XML?

В настоящее время довольно распространенной практикой является поиск объектов в формате XML, чтобы их можно было передавать через Интернет независимо от языка/платформы. Почему бы не сделать то же самое и не сохранить его как varchar в БД.

Примечание: Очевидным недостатком этого метода является то, что вы не сможете выбирать поля в базе данных по атрибутам объекта чистым способом, потому что он смешивает несколько атрибутов объекта в одно поле базы данных.

Если вам действительно нужны атрибуты объекта, доступные для поиска, вам нужно будет разделить данные из каждого атрибута объекта на соответствующие поля.

 2
Author: Evan Plaice, 2010-06-21 23:36:44

, похоже, не поддерживается. oci_bind_array_by_name() и oci_bind_by_name(), похоже, могут передавать только примитивные типы. Документация не показывает никакой другой возможности.

Совместное использование объектов/структур/сложных типов непросто, так как представление объекта на разных языках может быть далеко друг от друга. Например memcached позволяет хранить объекты с любого языка, в котором есть библиотека, преобразующая объекты из собственного представления в memcached и наоборот.

Вы могли бы сделать это если бы в oci8 был конвертер между хэшами/объектами PHP в сложные типы в PL/SQL, но это не так.

Вы просто можете сделать несколько вызовов oci_bind_by_name() и таким образом вызвать свою процедуру с таким количеством аргументов, сколько необходимо для каждого ключа вашего хэш-типа/сложного типа.

 3
Author: Serty Oan, 2010-06-16 12:40:57

В соответствии с предложением Эванса я бы рекомендовал использовать JSON. Как PHP, так и Oracle могут кодировать/декодировать JSON, и это существенно менее подробно, чем XML.

Что бы вы ни выбрали, сериализация - это, вероятно, правильный путь. Тем не менее, я бы не советовал хранить необработанный JSON в поле varchar - Oracle может (с помощью инструмента, связанного выше) как интерпретировать JSON, так и генерировать ответы JSON.

 1
Author: Tom Wright, 2010-06-22 00:16:43

JSON "легче", но мне действительно непонятно, зачем кому-то понадобилось использовать JSON в Oracle с возможностями обработки Oracle XML и XML DB в своем распоряжении. Обсуждение сериализации исчезает, поскольку Oracle может "измельчать" XML в реляционные таблицы для обеспечения высокой производительности и доступности без написания разработчиком одной строки кода (а также без необходимости полагаться на непроверенные проекты json), а также прозрачно извлекать его в виде XML.

Другой наблюдение состоит в том, что оставаться "агностиком базы данных", как рекомендовано выше, в то время как переносимый, резко ограничивает способность разработчика использовать преимущества чрезвычайно мощных функций, предоставляемых современными движками баз данных.

Я знаю, что этот комментарий "запоздал", однако все эти утверждения были верны в Oracle 10g во время приведенных выше ответов, и я уверен, что люди все еще сталкиваются с этой конкретной проблемой

Моя сильная рекомендация для всех, кто использует PHP и Oracle, - использовать XML и воспользуйтесь преимуществами невероятных функций обработки XML оракулов.

 1
Author: ricki, 2011-03-28 22:24:11