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

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

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

解决办法:

 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长度超过32767导致的溢出问题,字符或值错误
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);
UTL_HTTP.SET_BODY_CHARSET('UTF-8');
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;

DECLARE
v_doc_fin CLOB := '';
req utl_http.req;
res utl_http.resp;
url VARCHAR2(1900) := 'url xxx';
v_value VARCHAR2(4000);
vchunkdata VARCHAR2(2000);
v_req_length NUMBER;
buffer VARCHAR2(32767);
offset NUMBER := 1;
amount NUMBER := 32767;
utl_err VARCHAR2(1000);
BEGIN
IF v_doc_fin IS NOT NULL THEN
--v_doc_fin is JSON DOC of CLOB data type from a procedure
v_req_length := dbms_lob.getlength(v_doc_fin);
dbms_output.put_line(v_req_length);
req := utl_http.begin_request(url, 'POST', 'HTTP/1.1');
utl_http.set_header(req, 'Content-Length', v_req_length);
utl_http.set_header(req, 'user-agent', 'mozilla/4.0');
utl_http.set_header(req,
'content-type',
'application/json;charset=UTF-8');
utl_http.set_header(req, 'Transfer-Encoding', 'chunked');
utl_http.set_body_charset('UTF-8');
WHILE (offset < v_req_length) LOOP
dbms_lob.read(v_doc_fin, amount, offset, buffer);
utl_http.write_text(r => req, data => buffer);
offset := offset + amount;
END LOOP;
res := utl_http.get_response(req);
BEGIN
LOOP
utl_http.read_line(res, v_value);
dbms_output.put_line(v_value);
END LOOP;
utl_http.end_response(res);
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(res);
WHEN utl_http.too_many_requests THEN
utl_http.end_response(res);
WHEN OTHERS THEN
dbms_output.put_line(utl_http.get_detailed_sqlerrm);
dbms_output.put_line(dbms_utility.format_error_stack);
dbms_output.put_line(dbms_utility.format_error_backtrace);
dbms_output.put_line(dbms_utility.format_call_stack);
END;
END IF;
EXCEPTION
WHEN OTHERS THEN
utl_http.end_response(res);
utl_err := utl_http.get_detailed_sqlerrm;
END;

参考:

Oracle 通过UTL_HTTP 发送http请求并处理发送内容中包含空格和特殊字符的问题

utl_http request and response stops when  > 32k

UTTL_HTTP to POST CLOB request

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

记一次使用utl_http方法调用接口,报字符或值错误的更多相关文章

  1. springboot 服务工程,前端服务调用接口报跨域错误

    前后端分离,VUE.JS调用服务接口时,跨域错误.需要服务接口工程设置,如下: @SpringBootApplicationpublic class SpringCloudOpenapiApplica ...

  2. 前端调用接口报错看不到报错响应时 console.dir

    console.dir() 可以看到很多.log看不到的属性和方法

  3. spring cloud feign 调用接口报错"No message available

    There was an unexpected error (type=Internal Server Error, status=500). status 404 reading HelloServ ...

  4. Java RMI远程方法调用

    RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...

  5. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  6. golang方法和接口

    一.  go方法 go方法:在函数的func和函数名间增加一个特殊的接收器类型,接收器可以是结构体类型或非结构体类型.接收器可以在方法内部访问.创建一个接收器类型为Type的methodName方法. ...

  7. RMI远端方法调用

    一.RMI介绍 RMI(Remote Method Invocation),RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信.必须在jdk1.1以上,RMI用到的类:java. ...

  8. 难道同事:Java 方法调用到底是传值还是传引用

    Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...

  9. 难住了同事:Java 方法调用到底是传值还是传引用

    Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...

随机推荐

  1. shell脚本简单实例

    1.模拟linnux登录shell #/bin/bashecho -n "login:" read nameecho -n "password:"read pa ...

  2. 20145101《JAVA程序设计》课程总结

    每周读书笔记链接汇总 假期笔记 第1周学习总结 第2周学习总结 第3周学习总结 第4周学习总结 第5周学习总结 第6周学习总结 第7周学习总结 第8周学习总结 第9周学习总结 第10周学习总结 实验报 ...

  3. 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现

    20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...

  4. [noip模拟题]科技节 - 搜索 - 位运算优化

    [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那么多活动,还要不要认真学习了?!这样不行!……于是,校长 ...

  5. Vue开发中的中央事件总线

    在Vue开发中会遇到大量的组件之间共享数据的情形,针对不同的情形,Vue有相对应的解决方案.比如,父组件向子组件传值可以使用props,复杂项目中不同模块之间传值可以使用Vuex.但是,对于一些简单的 ...

  6. Js页面自动跳转

    //声明 t = 1 var t = 10; function openwin() { t -= 1; if(t==0){ location.href='index2.html'; } setTime ...

  7. python 集合清空

    setp = set(["Red", "Green"]) setq = setp.copy() print(setq) setp.clear() print(s ...

  8. ubuntu16.04 server(amd 64) 下载

    http://mirrors.aliyun.com/ubuntu-releases/16.04/ http://old-releases.ubuntu.com/releases/16.04.3/

  9. jQuery双击编辑td数据

    html <td class="remark" style="width: 200px;"> {$vo.remark} </td> js ...

  10. node 循序渐进

    1. 执行 node helloworld.js 2. http  服务器 建 server.js 文件 -  node server.js  跑起来 -  浏览器访问  http://localho ...