Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Oracle DB 11.2调用负载超过32000个字符的SOAP WS?_Oracle_Soap_Plsql - Fatal编程技术网

如何从Oracle DB 11.2调用负载超过32000个字符的SOAP WS?

如何从Oracle DB 11.2调用负载超过32000个字符的SOAP WS?,oracle,soap,plsql,Oracle,Soap,Plsql,各位同事好。我需要从OracleDB调用SOAP web服务,其中负载由base64编码的文件组成。问题是我的有效负载大小有限制-32000个字符(varchar类型)。例如,和。所以这意味着我不能在负载相当大的情况下调用web服务。有任何例子表明有效载荷增加了varchar2类型的限制。比你强 要超过32k字符的限制,您可以尝试将CLOB与utl\u http一起使用。以下是执行此操作的步骤: PROCEDURE write_clob_to_http_request(pc_clob IN OU

各位同事好。我需要从OracleDB调用SOAP web服务,其中负载由base64编码的文件组成。问题是我的有效负载大小有限制-32000个字符(varchar类型)。例如,和。所以这意味着我不能在负载相当大的情况下调用web服务。有任何例子表明有效载荷增加了varchar2类型的限制。比你强

要超过32k字符的限制,您可以尝试将
CLOB
utl\u 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;

我从未使用过
utl\u http
,但它看起来类似于用于发送电子邮件的
utl\u smtp
。我猜要打破
varchar2
限制,您必须将有效负载设置为
clob
,然后将有效负载拆分为
utl\u http接受的chunck。写入文本
并为每个chunck调用
write\u text
。感谢您的想法:
pc_content CLOB := TO_CLOB('a string') || TO_CLOB('another string)...;