Как вернуть большой текст в ORDS, используя JSON (более 32 КБ) - PullRequest
1 голос
/ 26 марта 2019

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

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

  • Я пытался переместить контент из CLOB в LONG, но безуспешно.
  • Я попытался создать две переменные Long с нужным мне текстом и объединить их с переменной Long для вывода, но также безуспешно.
  • Мне удалось вернуть содержимое в ResultSet, но это сделает структуру 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 - это ResultSet, а не Long

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 Ответ

1 голос
/ 27 марта 2019

Не удалось найти способ сделать это автоматически, поэтому я сам пишу 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('"}');
...