Могут ли PHP и Oracle передавать сложные типы друг другу? - PullRequest
3 голосов
/ 07 июня 2010

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

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

Ответы [ 4 ]

3 голосов
/ 16 июня 2010

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

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

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

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

2 голосов
/ 22 июня 2010

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

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

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

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

1 голос
/ 29 марта 2011

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

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

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

Я настоятельно рекомендую всем, кто использует PHP и Oracle, использовать XML и использовать невероятные возможности обработки XML в Oracle.

1 голос
/ 22 июня 2010

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

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

...