Ваш запрос курсора может найти десятки строк, но вы делаете это:
for a in c_get_prihod loop
l_string_request:= ... ;
end loop;
Каждый раз вокруг этого l oop вы заменяете все содержимое l_string_request
, поэтому сколько бы строк вы ни получили и сколько раз вы go вокруг l oop, вы всегда получите строку, содержащую только последнюю строку, возвращаемую этим запросом. Таким образом, вы отправляете только эту единственную последнюю запись в веб-службу.
Предполагая, что принимающая служба ожидает массив записей, вам может понадобиться что-то вроде:
begin
l_string_request := '[ ';
for a in c_get_prihod loop
if a.FLAG > 1 then
l_string_request := l_string_request || ', ';
end if;
l_string_request := l_string_request || '{ ';
l_string_request := l_string_request || '"IdOrig": "' || a.IDORIG || '", ';
l_string_request := l_string_request || '"IdSustava": "' || a.IDSUSTAVA ||' ", ';
l_string_request := l_string_request || '"Datum": "' || a.DATUM || '", ';
l_string_request := l_string_request || '"SifAgencije": "' || a.SIFAGENCIJE || '", ';
l_string_request := l_string_request || '"SifDrzave": "' || a.SIFDRZAVE || '", ';
l_string_request := l_string_request || '"SifOsUsl": "' || a.SIFOSUSL || '", ';
l_string_request := l_string_request || '"IznosNeto": "' || a.IZNOSNETO || '", ';
l_string_request := l_string_request || '"IznosBruto": "' || a.IZNOSBRUTO || '", ';
l_string_request := l_string_request || '"IznosPoreza": "' || a.IZNOSPOREZA || '", ';
l_string_request := l_string_request || '"SifHotela": "' || a.SIFHOTELA || '"';
l_string_request := l_string_request || ' }';
end loop;
l_string_request := l_string_request || ' ]';
dbms_output.put_line(l_string_request);
...
где flag
- это дополнительный столбец, добавляемый к результату курсора, например, , ROWNUM AS FLAG
- так же, как механизм, чтобы узнать, находитесь ли вы в первой строке или в следующей строке (и поэтому требуется запятая между элементами массива).
dbms_output
позволяет вам видеть все сгенерированное значение, которое вы можете вручную проверить и / или пропустить через валидатор JSON, чтобы убедиться, что это именно то, что вы (и, что более важно, получающая служба) ожидаете увидеть. Вы по-прежнему можете добавлять новые строки во время построения JSON для удобочитаемости, хотя сервис не заботится об этом.
В зависимости от того, сколько строк у вас может быть, вам может понадобиться l_string_request
, чтобы быть CLOB вместо а varchar2
. Я также предлагаю вам явно форматировать значения даты / времени и правильно обрабатывать числа, если они у вас есть.
После модификации по вашему совету я получаю эту ошибку:
ORA-06502: PL / SQL: numeri c или ошибка значения ORA-06512: at "OPERA_MARRIOTT. HRS_LASERLINE_BI_PRIHOD ", строка 87
Вы получите это, если l_clob_response
пуст, поэтому, возможно, ваше чтение l oop не дает того, что вы ожидаете сейчас. (Что вполне может быть связано с тем, что запрос теперь недействителен JSON или не соответствует ожиданиям службы). После вызова UTL_HTTP.get_response()
посмотрите, что показывают l_http_response.status_code
и l_http_response.reason_phrase
. Коды состояния есть в документации .