我使用以下代码来读取http请求的响应:
FUNCTION readClob (ww_reponse IN OUT NOCOPY UTL_HTTP.resp)
RETURN CLOB
IS
l_clob CLOB;
l_text VARCHAR2 (32767);
BEGIN
DBMS_LOB.createtemporary (l_clob, FALSE);
BEGIN
LOOP
=> UTL_HTTP.read_text (ww_reponse, l_text, 32767);
DBMS_LOB.writeappend (l_clob, LENGTH (l_text), l_text);
END LOOP;
EXCEPTION
WHEN UTL_HTTP.end_of_body
THEN
UTL_HTTP.end_response (ww_reponse);
END;
这适用于小型请求,但是对于较长的请求(大约> 60秒),我在network access denied by access control list (ACL)
指令上收到ORA-24247错误(read_text
),但令我惊讶的是不是在第一次通话,而是在一些随机的下一次迭代,大约60秒后。我的ACL没问题,否则什么都行不通。
我也设置了更大的超时。显然错误不是“真正的”错误。有人有同样的问题和解决方案吗?谢谢。
环境: Windows Server 2008上的Oracle Database 11g企业版(64位)
答案 0 :(得分:0)
我终于去了Oracle支持,发现了这个: 删除并重新创建ACL,如下所示
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
acl => 'wallet-acl.xml',
description => 'Wallet ACL',
principal => 'APPS',
is_grant => TRUE,
privilege => 'use-client-certificates');
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'wallet-acl.xml',
principal => 'APPS',
is_grant => TRUE,
privilege => 'use-passwords');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_WALLET_ACL(
acl => 'wallet-acl.xml',
wallet_path => 'file:');
END;
/
然后我得到的消息已损坏(错过了一些字符)。
我在循环中添加了睡眠指令,现在一切都很好。不是真正的解决方案,而是最好的解决方法。
FUNCTION readClob (ww_reponse IN OUT NOCOPY UTL_HTTP.resp)
RETURN CLOB
IS
l_clob CLOB;
l_text VARCHAR2 (32767);
BEGIN
DBMS_LOB.createtemporary (l_clob, FALSE);
BEGIN
LOOP
UTL_HTTP.read_text (ww_reponse, l_text, 32767);
=> **dbms_lock.sleep(0.1);**
DBMS_LOB.writeappend (l_clob, LENGTH (l_text), l_text);
END LOOP;
EXCEPTION
WHEN UTL_HTTP.end_of_body
THEN
UTL_HTTP.end_response (ww_reponse);
END;