function в oracle из php

438
20 июля 2017, 00:41

Привет всем, такой вопрос как вызывая функцию 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.

Answer 1

К сожалению так объявленный тип данных (массив) можно использовать только внутри 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(:переменная) )
READ ALSO
Вывод PHP кода в Twig

Вывод PHP кода в Twig

Подскажите будьте добры как переделать код

333
Websocket php server

Websocket php server

Дайте, пожалуйста, пример создания сервера вебсокет на php, сервер должен лишь слушать что ему посылают и отправлять это же в ответе

286
Копирование файлов в архив

Копирование файлов в архив

Стоит задача скопировать файл в zip архивЕсли создавать новый файл и заносить туда контент то проблем нет, а как скопировать, например готовую...

272