记一次使用utl_http方法调用接口,报字符或值错误

Posted 黄洪波写点东西的地方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次使用utl_http方法调用接口,报字符或值错误相关的知识,希望对你有一定的参考价值。

背景:ebs系统和其他系统通过utl_http包调用接口,使用log方法记录日志。

某次调用接口,执行到记录日志行报字符或值错误。

查找原因,发现是p_str的长度超过的32747的限制。

解决办法:

 PROCEDURE log(p_str VARCHAR2) IS
  BEGIN
    fnd_file.put_line(fnd_file.log, p_str);
    dbms_output.put_line(p_str);
  END;
--解决l_messge_clob长度超过3276导致的溢出问题,字符或值错误
FOR i IN 0 .. trunc((dbms_lob.getlength(l_messge_clob) - 1) / l_step) LOOP
  log(dbms_lob.substr(l_messge_clob, l_step, i * l_step + 1));
END LOOP;


--同样 utl_http.write_text 长度不能超过32767,

buffer       VARCHAR2(2000);
offset       NUMBER := 1;
amount       NUMBER := 1024;


--解决l_messge_clob长度超过3276导致的溢出问题,字符或值错误
---utl_http.write_text(l_req, p_content);
WHILE (offset < v_req_length) LOOP
  dbms_lob.read(p_content, amount, offset, buffer);
  utl_http.write_text(r => l_req, data => buffer);
  offset := offset + amount;
END LOOP;

参考:

utl_http request and response stops when  > 32k

UTTL_HTTP to POST CLOB request

http://www.orafaq.com/forum/t/202946/

以上是关于记一次使用utl_http方法调用接口,报字符或值错误的主要内容,如果未能解决你的问题,请参考以下文章

记一次Oracle启动报错问题解决

Oracle11g utl_http调SAP接口传中文参数报500 Internal Server Error,参数没有中文可以正常运行。帮帮忙

记一次重构:并行化调用接口实践

如何通过PL / SQL utl_http.html_pieces确定一个部分

记一次SSM项目小结

通过具有 78000 个字符的 Oracle 12c DB 使用 utl_http 请求 REST 调用正文