В 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. Если есть возможность использовать и её, то было бы просто идеально.
В документации функции 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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах
Поделитесь, пожалуйста, опытом как сделать церковный календарь? Чтобы на каждый день снизу высвечивалась строка с именами святыхСам календарь...
Генерирую пароль на сервере в зависимости от даты и id Юзеры повадились откатывать дату на предыдущую и пользовать не генеря новый пароль!...