Как вернуть большой текст в ORDS с использованием JSON (более 32 кб)

#plsql #oracle-ords

#plsql #oracle-ords

Вопрос:

Я создаю Rest API в Oracle ORDS, и мне нужно вернуть текст base64, размер которого превышает 32 кб. Тип источника — PL / SQL.

Исходные данные находятся в переменной CLOB, но ORDS не поддерживает такого рода возврат. Я пытался использовать LONG, но я не могу переместить строку в LONG, когда она больше 32 кб.

  • Я попытался переместить содержимое из CLOB в LONG, но безуспешно.
  • Я попытался создать две длинные переменные с нужным мне текстом и объединить его с длинной переменной для вывода, но также безуспешно.
  • Я смог вернуть содержимое внутри результирующего набора, но это сделает структуру Json отличной от той, что мне нужна.
 --This is the variable that has the large text (about 40k characters)
out_hexa        CLOB;
  

— :boleto является параметром OUT в ORDS (OUT, RESPONSE, LONG)

 --This wont work:
:boleto := out_hexa;
  
 --This wont work:
:boleto := substr(out_hexa, 1, 32765) || substr(out_hexa, 32765, LENGTH(out_hexa));
  

—Это работает, но вывод Json получается не так, как я хотел, поскольку это создает второй уровень в Json
Важно: В этом случае :boleto — это результирующий набор, а не длинный

 OPEN :boleto FOR
     SELECT out_hexa as dados from dual;
In this case the output is:
{
    "boleto": [
        {
            "dados": "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7..."
        }
     ]
}


What I need is a Json in this format:
{
    "boleto": "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7..."
}
  

Комментарии:

1. ords действительно поддерживает возвращаемый LOB-объект, задайте для вашего исходного типа значение media resource, а для вашего mime-типа — application / base64 — что-то вроде этого thatjeffsmith.com/archive/2017/09/ords-returning-raw-json

2. Привет, хорошо, но в этом случае мне нужно вернуть mime-тип ‘application / json’, а содержимым одного поля будет строка base64 …. есть идеи? Спасибо!

3. создайте json самостоятельно

4. Да, это так… Я сам пишу Json и он работает. Спасибо!

Ответ №1:

Не удалось найти способ сделать это автоматически, поэтому я пишу Json сам. Я читаю CLOB по частям и записываю его с помощью HTP.prn:

       OWA_UTIL.mime_header('application/json', FALSE);
      OWA_UTIL.http_header_close;         
      htp.prn('{');
      htp.prn('"return_code" : "' ||out_status || '",');
      htp.prn('"return_message" : "' ||out_msg_retorno || '",');
      htp.prn('"boleto" : "');

      IF(out_status = '001') THEN
        :http_status      := 200;                    
        WHILE counter < length(out_hexa) chunk_size LOOP                     
            htp.prn(substr(out_hexa, counter, chunk_size));
            counter := counter chunk_size;
        END LOOP;        
      ELSE
        :http_status      := 404;
      END IF;
      htp.prn('"}');
  

Ответ №2:

Вы можете использовать это

APEX_UTIL.PRN ( p_clob В CLOB, p_escape В ЛОГИЧЕСКОМ ЗНАЧЕНИИ ПО УМОЛЧАНИЮ TRUE );