背景: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. 出现“基础链接已关闭,无法链接到远程服务器"错误的解决办法

    一些用户在安装一些软件或是系统做某些修改后,采集器就没无登录或是无法获取到网页.登录或是使用httppostget工具会出现 ”基础链接已关闭,无法链接到远程服务器“的提示.经分析,是系统Socket ...

  2. MySQL Crash Course #15# Chapter 23. Working with Stored Procedures

    以前写过类似的东西,用来自动生成数据. 你可以将 Stored Procedure 理解为可以重复使用的批处理文件. Stored Procedure 非常有用,我们应该尽可能地去使用它. 那么,应用 ...

  3. Python3 解决 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

    Python3 解决 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte 一.问题 request.Reque ...

  4. java replaceAll之$替换

    最近,在开发一个伪代码翻译工具的过程中,遇到个问题,我们在伪代码中使用spring EL的规则,将非变量限定在${"1"}中,解析后根据上下文的类型转换为相应的java类型.在规则 ...

  5. bzoj 3505 数三角形 - 组合数学

    给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出 ...

  6. VC++开机自动启动程序的几种方法 (转载)

    转载:http://blog.csdn.net/zhazhiqiang/article/details/51909703 很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能 ...

  7. Java序列化流-ObjectOutputStream、ObjectInputStream

    Java对象流的基本概念: 实例代码: 实体类User: import java.io.Serializable; /** * @author zsh * @company wlgzs * @crea ...

  8. 51nod 1021 石子归并

    区间dp 递推比递归的常数要小  所以还是尽量学会递推吧 看题解  各种恶心啊  有木有 还是视频讲的直接呃   不过就是讲的有点儿慢 链接:https://www.bilibili.com/vide ...

  9. Codeforces Round #527 (Div. 3)

    一场div3... 由于不计rating,所以打的比较浪,zhy直接开了个小号来掉分,于是他AK做出来了许多神仙题,但是在每一个程序里都是这么写的: 但是..sbzhy每题交了两次,第一遍都是对的,结 ...

  10. guulp配置编译ES6

    下面是gulp的配置文件,gulp具体使用点击查看 首先全局安装下 cnpm install gulp -g gulpfile.js  gulp配置文件 var gulp = require(&quo ...