Привет всем, такой вопрос как вызывая функцию oracle
из php вернуть значение не стандартного типа.
т.е. из php вызываю функцию: $query = $this->db->query ("select название_пакета.название_функции(:переменные) res from dual", $значения переменных);
В оракле в результате работы функции на выходе получается массив (не знаю как правильно это называется) вот такого типа:
TYPE название_типа is TABLE of varchar2(255) INDEX by BINARY_INTEGER;
название_массива название_типа; --объявил массив.
Выдает ошибку:
ORA-00902 неверен тип данных.
Подскажите как мне его правильно принять, чтоб потом с ним работать или как-то в json
строку все это добро переделать и потом уже её передавать в php.
К сожалению так объявленный тип данных (массив) можно использовать только внутри PL/SQL блоков. В запросах его использовать нельзя. Для использования в запросах и передачи в PHP надо использовать объектный тип, создаваемый глобально. К сожалению вы не указали, какая именно информация из этого массива нужна. Предположим вам нужны и сами строки и их индексы в массиве. Тогда нам надо создать два типа: объект представляющий строку и коллекцию таких объектов:
create type varcharByIntRow as object(
key number,
val varchar2(100)
);
create type varcharByInt as table of varcharByIntRow;
Если вам нужны только сами строки, а индексы не нужны, то вместо своего можно воспользоваться системным типом ODCIVarchar2List
.
Далее надо либо переделать вашу функцию в пакете, что бы она возвращала строки этого типа, либо если ее менять нельзя, сделать функцию обертку, которая получит массив от изначальной функции и вернет его в подходящем виде. Для возврата массивов для меньшего расхода памяти настоятельно рекомендуется использовать pipelined
функции. Такие функции возвращают результат постепенно, по мере его использования, а не формируют целиком весь массив и потом возвращают. Функция будет выглядеть примерно так:
function getResult(arg int) return varcharByInt PIPELINED is
i binary_integer;
data mtype; -- это ваш тип массива из пакета
begin
data:=test_package.f(arg); -- Вызываем существующую функцию, передавая аргументы
i:=data.first;
while i is not null loop
pipe row(varcharByIntRow(i,data(i))); -- Возвращаем очередную строку данных
i:=data.next(i);
end loop;
end get;
И наконец мы можем использовать функцию как обычную таблицу, для возврата результата в PHP (возвращаются колонки с именами key и val, как описано в нашем типе):
select * from table( getResult(:переменная) )
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Дайте, пожалуйста, пример создания сервера вебсокет на php, сервер должен лишь слушать что ему посылают и отправлять это же в ответе
Стоит задача скопировать файл в zip архивЕсли создавать новый файл и заносить туда контент то проблем нет, а как скопировать, например готовую...