如何使用 JSON 在 ORDS 中 return 大文本(超过 32k)
How to return large text in ORDS using JSON (more than 32k)
我正在 Oracle ORDS 中创建一个 Rest API,我需要 return 一个大于 32k 的 base64 文本。源类型是 PL/SQL.
原始数据在CLOB变量中,但ORDS不支持这种return。我尝试使用LONG,但是当它大于32k时我无法将字符串移动到LONG。
- 我尝试将内容从 CLOB 移动到 LONG,但没有成功。
- 我尝试用我需要的文本创建两个Long变量,并将其连接到Long变量输出,但也没有成功。
- 我能够 return ResultSet 中的内容,但这会使 Json 结构与我需要的不同。
--This is the variable that has the large text (about 40k characters)
out_hexa CLOB;
-- :boleto是ORDS中的OUT参数(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 是一个结果集,而不是一个 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..."
}
找不到自动执行此操作的方法,所以我正在自己编写 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('"}');
我正在 Oracle ORDS 中创建一个 Rest API,我需要 return 一个大于 32k 的 base64 文本。源类型是 PL/SQL.
原始数据在CLOB变量中,但ORDS不支持这种return。我尝试使用LONG,但是当它大于32k时我无法将字符串移动到LONG。
- 我尝试将内容从 CLOB 移动到 LONG,但没有成功。
- 我尝试用我需要的文本创建两个Long变量,并将其连接到Long变量输出,但也没有成功。
- 我能够 return ResultSet 中的内容,但这会使 Json 结构与我需要的不同。
--This is the variable that has the large text (about 40k characters)
out_hexa CLOB;
-- :boleto是ORDS中的OUT参数(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 是一个结果集,而不是一个 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..."
}
找不到自动执行此操作的方法,所以我正在自己编写 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('"}');