Как получить ассоциативные коллекции с символьным ключом в PHP?

84
04 апреля 2021, 20:30

В Oracle БД есть коллекция вида:

TYPE error_list_t IS TABLE OF SYS.ODCIVarchar2List INDEX BY varchar2(30)

Наполняется она в процедуре:

procedure set(name varchar2, value varchar2)
error_list error_list_t;
begin
    if not error_list.exists(name) then
        error_list(name) := SYS.ODCIVarchar2List();
    end if;
    error_list(name).extend;
    error_list(name)(error_list(name).count) := value;
end set;

Необходимо из PHP получить данную коллекцию, очень важно сохранить ключ name.

Так же, в проекте используется ORM Doctrine2. Если есть возможность использовать и её, то было бы просто идеально.

Answer 1

В документации функции oci_bind_array_by_name о подстановке массивов, ни двухмерных, ни ассоциативных с символным ключом, не упомянается. Значит получить такой массив как параметр или значение возврата не получится.

Самое простое решение, получить данный массив как ResultSet обычного запроса. Надо будет добавить конвейерную функцию и соответствуюий ей тип данных. Вот рабочий пример:

create or replace package pkg as
    type errorListT is table of SYS.ODCIVarchar2List index by varchar2 (30);
    type errorT is record (name varchar2(30), value varchar(32767)); 
    type errorsT is table of errorT;
    function getErrorList return errorsT pipelined;
end;    
/
create or replace package body pkg as
    -- это тестовые данные заменяющие результат процедуры set() в вопросе
    errors errorListT := errorListT (
        'name1'=>sys.ODCIVarchar2List ('error text 11','error text 12'),
        'name2'=>sys.ODCIVarchar2List ('error text 21','error text 22')); 
    function getErrorList return errorsT pipelined is
        name varchar2 (30) := errors.first; 
    begin
        while name is not null loop
            for ix in 1..errors(name).count loop
                pipe row (errorT (name, errors(name)(ix)));
            end loop;
            name := errors.next(name);
        end loop; 
        return;
    end;
end;
/

Вызов и результат будут выглядеть так:

select * from table (pkg.getErrorList ()) order by name
/
NAME     VALUE           
-------- ----------------
name1    error text 11   
name1    error text 12   
name2    error text 21   
name2    error text 22   
READ ALSO
Работа с большими массивами. Сортировка [закрыт]

Работа с большими массивами. Сортировка [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

133
Как сделать церковный календарь?

Как сделать церковный календарь?

Поделитесь, пожалуйста, опытом как сделать церковный календарь? Чтобы на каждый день снизу высвечивалась строка с именами святыхСам календарь...

119
Как проверить реальность даты?

Как проверить реальность даты?

Генерирую пароль на сервере в зависимости от даты и id Юзеры повадились откатывать дату на предыдущую и пользовать не генеря новый пароль!...

196