Могут ли PHP и Oracle передавать сложные типы друг другу?
Я хочу передать/привязать массив (key1, key2) к хранимой процедуре Oracle PL/SQL с использованием PHP. Я могу связывать примитивные типы и массивы примитивных типов, но не нашел способа передавать сложные типы данных туда и обратно.
Это не поддерживается? До сих пор мне приходилось передавать несколько массивов - по одному для каждого подтипа в моем сложном типе - а затем зависеть от их индексов, чтобы воссоздать их в процедуре.
4 answers
Почему бы вам не сериализовать состояние объекта в формате XML?
В настоящее время довольно распространенной практикой является поиск объектов в формате XML, чтобы их можно было передавать через Интернет независимо от языка/платформы. Почему бы не сделать то же самое и не сохранить его как varchar в БД.
Примечание: Очевидным недостатком этого метода является то, что вы не сможете выбирать поля в базе данных по атрибутам объекта чистым способом, потому что он смешивает несколько атрибутов объекта в одно поле базы данных.
Если вам действительно нужны атрибуты объекта, доступные для поиска, вам нужно будет разделить данные из каждого атрибута объекта на соответствующие поля.
, похоже, не поддерживается. oci_bind_array_by_name()
и oci_bind_by_name()
, похоже, могут передавать только примитивные типы. Документация не показывает никакой другой возможности.
Совместное использование объектов/структур/сложных типов непросто, так как представление объекта на разных языках может быть далеко друг от друга. Например memcached
позволяет хранить объекты с любого языка, в котором есть библиотека, преобразующая объекты из собственного представления в memcached и наоборот.
Вы могли бы сделать это если бы в oci8 был конвертер между хэшами/объектами PHP в сложные типы в PL/SQL, но это не так.
Вы просто можете сделать несколько вызовов oci_bind_by_name()
и таким образом вызвать свою процедуру с таким количеством аргументов, сколько необходимо для каждого ключа вашего хэш-типа/сложного типа.
В соответствии с предложением Эванса я бы рекомендовал использовать JSON. Как PHP, так и Oracle могут кодировать/декодировать JSON, и это существенно менее подробно, чем XML.
Что бы вы ни выбрали, сериализация - это, вероятно, правильный путь. Тем не менее, я бы не советовал хранить необработанный JSON в поле varchar - Oracle может (с помощью инструмента, связанного выше) как интерпретировать JSON, так и генерировать ответы JSON.
JSON "легче", но мне действительно непонятно, зачем кому-то понадобилось использовать JSON в Oracle с возможностями обработки Oracle XML и XML DB в своем распоряжении. Обсуждение сериализации исчезает, поскольку Oracle может "измельчать" XML в реляционные таблицы для обеспечения высокой производительности и доступности без написания разработчиком одной строки кода (а также без необходимости полагаться на непроверенные проекты json), а также прозрачно извлекать его в виде XML.
Другой наблюдение состоит в том, что оставаться "агностиком базы данных", как рекомендовано выше, в то время как переносимый, резко ограничивает способность разработчика использовать преимущества чрезвычайно мощных функций, предоставляемых современными движками баз данных.
Я знаю, что этот комментарий "запоздал", однако все эти утверждения были верны в Oracle 10g во время приведенных выше ответов, и я уверен, что люди все еще сталкиваются с этой конкретной проблемой
Моя сильная рекомендация для всех, кто использует PHP и Oracle, - использовать XML и воспользуйтесь преимуществами невероятных функций обработки XML оракулов.