2

次のコードを使用して、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 秒以上) では、命令で ORA-24247 エラー ( network access denied by access control list (ACL)) が発生しますread_textが、驚いたことに、最初の呼び出しではなく、ランダムな次の反復で、約 60 です。秒後。私の ACL は問題ありません。そうでなければ、何も機能しません。また、より大きなタイムアウトを設定しました。明らかに、エラーは「実際の」エラーではありません。誰もが同じ問題と解決策を持っていますか? ありがとうございました。

環境: Windows Server 2008 (64 ビット) 上の Oracle Database 11g Enterprise Edition

4

1 に答える 1

1

私は最終的に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;
于 2013-12-05T13:39:13.273 に答える