记一次使用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 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...
随机推荐
- MySQL数据库----事务处理
事物处理 一. 什么是事务 一组sql语句批量执行,要么全部执行成功,要么全部执行失败 二.为什么出现这种技术 为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一 ...
- Total Difference String
Total Difference Strings 给一个string列表,判断有多少个不同的string,返回个数相同的定义:字符串长度相等并从左到右,或从右往左是同样的字符 abc 和 cba 为视 ...
- 函数指针(pointer to function)——qsort函数应用实例
一,举例应用 在ACM比赛中常使用 stdlib.h 中自带的 qsort 函数,是教科书式的函数指针应用示范. #include <stdio.h> #include <stdli ...
- 20145122《Java程序设计》第九周学习总结
教材学习内容总结 1.JDBC代表Java数据库连接,这是一个标准的Java API与数据库无关的与Java编程语言之间的和大多数数据库连接.JDBC API支持两层和三层的处理模式对数据库的访问,但 ...
- 2017.7.4 ACM校内赛 Round 2
这是一个向导 A - hdu 3652 B - bzoj 4152 C - bzoj 2429 D - bzoj 1087 E - bzoj 1566 F - bzoj 4043 G - bzoj 1 ...
- 计算TCP链接的RTO超时重传时间
- AS语法
SELECT COUNT(*) AS NumberOfOrders FROM Orders 含义:将选出的数据作为一列显示,列名为NumberOfOrders
- Python3基础 __setattr__ 在属性被赋值的时候,新增提示功能
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- The destination you provided is not a full refname (i.e., starting with "refs/")
$ git push v5 v5/hotfix/5.1:hotfix/5.1-quartzerror: The destination you provided is not a full refna ...
- substring()的用法和注意事项
作者原创:转载请注明出处 substring()方法的作用为截取字符串,其有两种用法: 分别如下: substring(int beginIndex);这个的作用为截取从beginindex位置处的元 ...