Могут ли PHP и Oracle Pass Complex Types друг другу?
Вопрос
Я хочу передать/связать массив (Key1, Key2) к хранимой процедуре Oracle PL/SQL с использованием PHP. Я могу связывать примитивные типы и массивы примитивных типов, но не нашел способ передать сложные данные дата туда -сюда.
Это не поддерживается? До сих пор мне приходилось проходить по нескольким массивам - по одному для каждого подтипа в моем сложном типе, а затем зависел от их индексов, чтобы восстановить их в процедуре.
Решение
Почему бы вам не сериализовать состояние объекта как XML?
В настоящее время довольно распространена практика, чтобы определить объекты как XML, чтобы их можно было передавать по Интернету в языке/платформе. Почему бы не сделать то же самое и сохранить его как варчар в БД.
Примечание. Яркий дефицит этого метода заключается в том, что вы не сможете выбрать поля в базе данных по атрибутам объекта чистым образом, потому что он смешивает несколько атрибутов объекта в одном поле базы данных.
если ты делать Нужны атрибуты объекта, чтобы можно было найти поиск, вам нужно разбить данные из каждого из атрибутов объекта в свои соответствующие поля.
Другие советы
Не кажется поддерживаемым. oci_bind_array_by_name()
а также oci_bind_by_name()
Кажется, способны проходить только примитивные типы. А документация не показывает никакой другой возможности.
Обмен объектом/структурами/сложными типами нелегко, так как представление объекта на разных языках может быть далеко друг от друга. Например memcached
Разрешить хранить объекты на любом языке, в которой есть библиотека, которая преобразует объекты из своего собственного представления в Memcached One и наоборот.
Вы могли бы сделать это, если OCI8 имел преобразователь между хэши/объектами PHP в комплексные типы в PL/SQL, но это не так.
Вы просто можете сделать несколько звонков oci_bind_by_name()
И поэтому назовите свою процедуру с таким большим количеством аргументов, сколько необходимо для каждого ключа вашего хэш/комплексного типа.
В дополнение к предложению Эванса, я бы порекомендовал использовать JSON. Оба PHP а также Оракул может кодировать/декодировать JSON, и это значительно менее словес, чем XML.
Что бы вы ни выбрали, сериализация - это, вероятно, путь. Тем не менее, я бы посоветовал не хранить Raw JSON в поле Varchar - Oracle может (с инструментом, связанным выше), как интерпретировать JSON, так и генерировать ответы JSON.
JSON «легче», но мне очень неясно, зачем кому -то хотеть использовать JSON в Oracle с силой Oracle XML -возможностей и XML DB в своем распоряжении. Обсуждение сериализации исчезает, когда Oracle может «разбить» XML в реляционные таблицы для высокой производительности и доступности, чтобы разработчик не написал одну строку кода (а также без необходимости полагаться на недоказанные проекты JSON) - и также получает его как XML.
Другое наблюдение состоит в том, что оставаться «агностикой базы данных», как рекомендовано выше, в то время как портативный, драматично ограничивает способность разработчика воспользоваться огромными мощными функциями, которые предоставляют современные двигатели базы данных.
Я знаю, что этот комментарий «опоздал», однако все эти заявления верны в Oracle 10G во время ответов выше, и я уверен, что люди все еще сталкиваются с этой конкретной проблемой
Моя сильная рекомендация для всех, используя PHP и Oracle, - использовать XML и воспользоваться преимуществами невероятных функций обработки XML.