博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记一次使用utl_http方法调用接口,报字符或值错误
阅读量:7071 次
发布时间:2019-06-28

本文共 2742 字,大约阅读时间需要 9 分钟。

背景: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;

 

 

 

参考:

UTTL_HTTP to POST CLOB request

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

转载地址:http://xzkml.baihongyu.com/

你可能感兴趣的文章
vue组件值传递之父组件向子组件传递(props)
查看>>
MySQL5.6 主从复制 ERROR 1776 (HY000): Parameters MASTER_LOG_FILE
查看>>
mysql重启,重启释放ibtmp1
查看>>
我是一个线程(修订版) 转
查看>>
numpy二分查找
查看>>
DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
查看>>
【视频】ASP.NET Core MVC 2.* 入门
查看>>
Go基础系列:接口类型断言和type-switch
查看>>
Presentational and Container Components
查看>>
windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项
查看>>
Android 性能优化的方面方面都在这儿
查看>>
clover无缘无故隐藏书签栏原因
查看>>
Spark 用户自定义函数 Java 示例
查看>>
RabbitMQ 发布订阅
查看>>
Python&R&量化 金融之路
查看>>
有关java中static关键的重写问题
查看>>
Tortoise SVN 创建分支与合并
查看>>
Delphi 发送按键
查看>>
Python - 默认参数的一次性求值
查看>>
Asp.net DateTime格式化
查看>>