从Oracle APEX中的RESTful服务返回单个大CLOB

vnjpjtjt  于 2023-04-05  发布在  Oracle
关注(0)|答案(2)|浏览(202)

有没有什么方法可以将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,这很有效,但我想知道是否有一种方法可以一次性发送整个东西。

bjg7j2ky

bjg7j2ky1#

文档指出htp.phtp.prn只接受VARCHAR2,所以你受到varchar2的最大大小的限制,如果clob长度超过这个值,它会抛出一个错误。这是你可以做的:
在4k块中循环通过clob并使用htp.prn输出。避免在循环中使用htp.p,因为这会生成一个换行符,这可能会扰乱输出,例如如果你正在生成json。通过设置mime头让浏览器知道他得到了什么也是一个很好的做法。

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;
suzh9iv8

suzh9iv82#

APEX_UTIL.PRN (
 p_clob IN CLOB,
 p_escape IN BOOLEAN DEFAULT TRUE );

相关问题