从 Oracle APEX 中的 restful 服务返回单个大 clob
Returning a single large clob from a restful service in Oracle APEX
有什么方法可以 return 将 clob 作为文本(或文件)而不先拆分成更小的部分?
我尝试使用 PL/SQL
源创建一个 GET
处理程序来执行此操作:
declare
txt clob;
begin
...-- set clob
htp.p(txt);
end;
但后来我收到错误 ORA-06502: PL/SQL: numeric or value error
。
然后我尝试将 clob 分成更小的部分并多次调用 htp.p
,这奏效了,但我想知道是否有办法一次发送整个东西。
doc 声明 htp.p
和 htp.prn
仅采用 VARCHAR2,因此您受到 varchar2 的最大大小的限制,如果 clob 长度超过该长度,它将抛出一个错误。您可以这样做:
以 4k 块循环遍历 clob 并使用 htp.prn
输出。避免在循环中使用 htp.p
,因为这会生成一个换行符,这可能会弄乱输出,例如,如果您正在生成 json。通过设置 mime header.
让浏览器知道他得到了什么也是一个好习惯
DECLARE
l_clob CLOB;
l_amt INTEGER := 4000;
l_pos INTEGER := 1;
l_buf VARCHAR2(4000);
BEGIN
owa_util.mime_header ('text/html', true);
l_clob := '....';
LOOP
BEGIN
dbms_lob.read(
l_clob,
l_amt,
l_pos,
l_buf
);
l_pos := l_pos + l_amt;
-- need htp.prn since htp.p generates a newline char at the end.
htp.prn(l_buf);
EXCEPTION
WHEN no_data_found THEN
EXIT;
END;
END LOOP;
END;
有什么方法可以 return 将 clob 作为文本(或文件)而不先拆分成更小的部分?
我尝试使用 PL/SQL
源创建一个 GET
处理程序来执行此操作:
declare
txt clob;
begin
...-- set clob
htp.p(txt);
end;
但后来我收到错误 ORA-06502: PL/SQL: numeric or value error
。
然后我尝试将 clob 分成更小的部分并多次调用 htp.p
,这奏效了,但我想知道是否有办法一次发送整个东西。
doc 声明 htp.p
和 htp.prn
仅采用 VARCHAR2,因此您受到 varchar2 的最大大小的限制,如果 clob 长度超过该长度,它将抛出一个错误。您可以这样做:
以 4k 块循环遍历 clob 并使用 htp.prn
输出。避免在循环中使用 htp.p
,因为这会生成一个换行符,这可能会弄乱输出,例如,如果您正在生成 json。通过设置 mime header.
DECLARE
l_clob CLOB;
l_amt INTEGER := 4000;
l_pos INTEGER := 1;
l_buf VARCHAR2(4000);
BEGIN
owa_util.mime_header ('text/html', true);
l_clob := '....';
LOOP
BEGIN
dbms_lob.read(
l_clob,
l_amt,
l_pos,
l_buf
);
l_pos := l_pos + l_amt;
-- need htp.prn since htp.p generates a newline char at the end.
htp.prn(l_buf);
EXCEPTION
WHEN no_data_found THEN
EXIT;
END;
END LOOP;
END;