如何使用负载超过 32000 个字符的 Oracle DB 11.2 调用 SOAP WS?
Posted
技术标签:
【中文标题】如何使用负载超过 32000 个字符的 Oracle DB 11.2 调用 SOAP WS?【英文标题】:How to call SOAP WS from Oracle DB 11.2 with payload more than 32000 chars? 【发布时间】:2015-09-07 07:46:53 【问题描述】:同学们,你们好。我需要从 Oracle DB 调用 SOAP Web 服务,其中有效负载由 base64 编码的文件组成。问题是我对有效负载大小有限制 - 32 000 个字符(varchar 类型)。例如,here 和 here。所以这意味着我不能调用有效负载非常大的网络服务。有任何有效负载增加 varchar2 类型限制的示例。比你。
【问题讨论】:
我从未使用过utl_http
,但它看起来类似于用于发送电子邮件的utl_smtp
。我想要打破varchar2
的限制,您必须将有效负载设置为clob
,然后将有效负载拆分为utl_http.write_text
接受的块,并为每个块调用write_text
。
感谢您的想法:kurzhals.info/2012/03/…
【参考方案1】:
要超过 32k 个字符的限制,您可以尝试使用 CLOB
和 utl_http
。这是一个过程:
PROCEDURE write_clob_to_http_request(pc_clob IN OUT NOCOPY CLOB)
IS
ln_offset NUMBER := 1;
ln_i NUMBER := 1;
ln_amount NUMBER := 32767;
ln_clob_length NUMBER := dbms_lob.getlength(pc_clob);
lv_buffer VARCHAR2(32767);
luh_http_request utl_http.req;
BEGIN
luh_http_request := utl_http.begin_request('http://SoapServiceLocation' , 'POST', 'HTTP/1.1');
utl_http.set_header(luh_http_request, 'Content-Type', lv_http_content_type);
utl_http.set_header(luh_http_request, 'Content-Length', LENGTH(pc_content));
utl_http.set_header(luh_http_request, 'SOAPAction', 'http://SoapServiceLocation');
IF dbms_lob.isopen(pc_clob) != 1 THEN
dbms_lob.open(pc_clob, 0);
END IF;
WHILE ( ln_offset < ln_clob_length )
LOOP
dbms_lob.read(pc_clob, ln_amount, ln_offset, lv_buffer);
UTL_HTTP.write_text(luh_http_request, lv_buffer);
ln_offset := ln_offset + ln_amount;
ln_i := ln_i + 1;
END LOOP;
IF dbms_lob.isopen(pc_clob) = 1 THEN
dbms_lob.close(pc_clob);
END IF;
luh_http_response := utl_http.get_response(luh_http_request);
utl_http.read_text(luh_http_response, pc_content);
utl_http.end_response(luh_http_response);
END write_clob_to_http_request;
您可以通过连接VARCHAR2
变量轻松创建CLOB
:
pc_content CLOB := TO_CLOB('a string') || TO_CLOB('another string)...;
【讨论】:
以上是关于如何使用负载超过 32000 个字符的 Oracle DB 11.2 调用 SOAP WS?的主要内容,如果未能解决你的问题,请参考以下文章
实体框架oracle:将超过2000个字符插入VARCHAR2(4000 CHAR)失败
如何将 AWS 应用程序负载均衡器配置为超过 25 个 SSL 证书限制
为啥会出现错误:“InternalCompilerError:请求的静态内存负载超过 32 个字节”?
如何在超过 2 台服务器的主动/被动模式下进行 tcp 负载平衡?