Вопрос

Я хочу передать/связать массив (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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top