记一次使用utl_http方法调用接口,报字符或值错误
背景: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方法调用接口,报字符或值错误的更多相关文章
- springboot 服务工程,前端服务调用接口报跨域错误
前后端分离,VUE.JS调用服务接口时,跨域错误.需要服务接口工程设置,如下: @SpringBootApplicationpublic class SpringCloudOpenapiApplica ...
- 前端调用接口报错看不到报错响应时 console.dir
console.dir() 可以看到很多.log看不到的属性和方法
- spring cloud feign 调用接口报错"No message available
There was an unexpected error (type=Internal Server Error, status=500). status 404 reading HelloServ ...
- Java RMI远程方法调用
RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- golang方法和接口
一. go方法 go方法:在函数的func和函数名间增加一个特殊的接收器类型,接收器可以是结构体类型或非结构体类型.接收器可以在方法内部访问.创建一个接收器类型为Type的methodName方法. ...
- RMI远端方法调用
一.RMI介绍 RMI(Remote Method Invocation),RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信.必须在jdk1.1以上,RMI用到的类:java. ...
- 难道同事:Java 方法调用到底是传值还是传引用
Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...
- 难住了同事:Java 方法调用到底是传值还是传引用
Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...
随机推荐
- SNMP学习笔记之SNMPWALK 安装与使用详解
0x00 简介 snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户.通过snmpwalk也可以查看支 ...
- Python Web学习笔记之WebSocket 通信过程与实现
一.什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务 ...
- P4180 【模板】严格次小生成树[BJWC2010]
P4180 [模板]严格次小生成树[BJWC2010] 倍增(LCA)+最小生成树 施工队挖断学校光缆导致断网1天(大雾) 考虑直接枚举不在最小生成树上的边.但是边权可能与最小生成树上的边相等,这样删 ...
- JS中怎么调用<%%>的值
JS中怎么调用<%%>的值 示例代码一: <% String usercode = request.getParameter("usercode");//用req ...
- 20145213《网络对抗》逆向及Bof基础
实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...
- Visual Leak Detector简明使用教程
Visual Leak Detector是一款内存泄漏检测软件,主要的作用就是检测可能或者是存在内存泄露的地方,具体的功能的话,可以百度下,今天主要简单介绍下怎么使用 首先下载Visual Leak ...
- 导出数据库表为world文档说明,以及PowerDesigner导出表结构pdm设计文档
如何使用“mysql导出数据库结构为world工具”以及如何使用powerdesigner映射数据库模型 一.通过powerdesigner配置ojdbc 1.安装并打开powerdesigner,新 ...
- [JavaScript] - 7kyu
Johnny is a boy who likes to open and close lockers. He loves it so much that one day, when school w ...
- C++课程上 有关“指针” 的小结
上完了C++的第二节课以后,觉得应该对这个内容进行一个小结,巩固知识点,并对我的心情进行了一个侧面烘托... 开始上课的老师: 正在上课的我: 上去敲代码的我: 过程是这样的: 下来的我: 非常的尴尬 ...
- js中可以直接使用id而不用获取id
先来看一个例子: 不获取 id 也可以使用 id 元素. <!-- Author: XiaoWen Create a file: 2017-01-11 13:58:01 Last modifie ...