Problema com utl_http

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Galera estou usando o utl_http para me conectar a um webservice e trocar informações com o mesmo, está tudo ok, funcionando muito bem, mas de tempos em tempos a package para de funcionar apresentando o seguinte erro.

Selecionar tudo

sqlerrm-> ORA-20002: Erro na execução do programa controle: ORA-20210: Erro geral: ORA-20280: Erro ao comunicar-se com o rkam.com.br para envio de XML da nota 0267188: ORA-29273: HTTP request failed
ORA-06512: at ""SYS.UTL_HTTP"", line 1222
ORA-29270: too many open HTTP requests - DBMS_UTILITY.FORMAT_ERROR_STACK-> ORA-20002: Erro na execução do programa controle: ORA-20210: Erro geral: ORA-20280: Erro ao comunicar-se com o mobile.rkam.com.br para envio de XML da nota 267188: ORA-29273: HTTP request failed
ORA-06512: at ""SYS.UTL_HTTP"", line 1222
ORA-29270: too many open HTTP requests
O problema exibido é o fato de se ter muitas conexões abertas, pelo o que eu estudei o oracle fecha automaticamente suas conexões, mas no meu codigo estou usando o utl_http.set_persistent_conn_support(http_req,true); onde mantem a conexão, assim posso enviar varios dados dentro de um loop sem ter que abrir uma conexão a cada vez, isso é para mandar grandes quantidades de dados, agora a duvida como fechar a conexao? Segue abaixo o codigo de acesso.
Obrigado!

Selecionar tudo

http_req := utl_http.begin_request(WW_URL, 'POST',utl_http.HTTP_VERSION_1_1);
                        utl_http.set_persistent_conn_support(http_req,true);
                        utl_http.set_body_charset(http_req, 'UTF-8');
                        UTL_HTTP.set_authentication(http_req, 'SA', 'GN5', 'Basic', TRUE );
                        utl_http.set_header(http_req, 'Content-Type', 'text/xml');
                        utl_http.set_header(http_req, 'Content-Length', length(WW_ENV));
                        utl_http.set_header(http_req, 'SOAPAction', 'setCliente');
                        utl_http.write_text(http_req,WW_ENV);

                        http_resp := utl_http.get_response(http_req);

                       IF (http_resp.status_code =utl_http.HTTP_OK ) THEN
                              utl_http.read_text(http_resp, WW_ENV_RESP);
                              utl_http.end_response(http_resp);
                              WW_RESP := xmltype.createxml(WW_ENV_RESP);

victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

CLOSE_PERSISTENT_CONN
Closes a HTTP persistent connection in the current session utl_http.close_persistent_conn(conn IN connection);
TBD

Selecionar tudo

Example: Using SET_PERSISTENT_CONN_SUPPORT

DECLARE
  TYPE vc2_table IS TABLE OF VARCHAR2(256) INDEX BY binary_integer;
  paths vc2_table;

  PROCEDURE fetch_pages(paths IN vc2_table) AS
    url_prefix VARCHAR2(256) := 'http://www.my-company.com/';
    req   utl_http.req;
    resp  utl_http.resp;
    data  VARCHAR2(1024);
  BEGIN
    FOR i IN 1..paths.count LOOP
      req := utl_http.begin_request(url_prefix || paths(i));

      -- Use persistent connection except for the last request
      IF (i < paths.count) THEN
        utl_http.set_persistent_conn_support(req, TRUE);
      END IF;
  
      resp := utl_http.get_response(req);
  
      BEGIN
        LOOP
          utl_http.read_text(resp, data);
          -- do something with the data
        END LOOP;
      EXCEPTION
        WHEN utl_http.end_of_body THEN
          NULL;
      END;
      utl_http.end_response(resp);
    END LOOP;
  END;

BEGIN
  utl_http.set_persistent_conn_support(FALSE, 1);
  paths(1) := '...';
  paths(2) := '...';
  ...   
  fetch_pages(paths);
END;

Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Neste seu exemplo está igua o meu onde você fecha a conexão?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

como fechar?

Selecionar tudo

utl_http.close_persistent_conn(conn IN connection); 
onde fechar?

onde você quiser.. agora de preferencia tem que ser apos a troca de informacoes desejadas, talvez a ultima coisa a ser feita
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

beleza, é que no seu exemplo de condigo não faz uso do

Selecionar tudo

utl_http.close_persistent_conn(conn IN connection); 
por isso fiquei na duvida de como você faz isso no codigo mostrado.
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

Amigo desculpa a ignorancia mas estou com uma duvida no comando utl_http.close_persistent_conn(conn IN connection);
o que eu passo de parametro "conn IN connection"

Valeu!
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Syntax

Selecionar tudo

UTL_HTTP.CLOSE_PERSISTENT_CONN (
   conn  IN connection);
Parameters

Table 169-18 CLOSE_PERSISTENT_CONN Procedure Parameters
Parameter Description

conn


The HTTP persistent connection to close
é o seu http_req mesmo

:lol:
Shakall
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 13 Ago 2008 6:57 pm
Localização: Blumenau - SC

então cara ao passar o meu http_req, da o seguinte erro.

Selecionar tudo

utl_htt.close_persistent_conn(http_req);

Selecionar tudo

PLS-00306: wrong number or types of arguments in call to 'CLOSE_PERSISTENT_CONN'
PLS/SQL: Statement ignored
PLS-00201: identifier 'CONN' must be declared
PL/SQL: Statement ignored
PLS-00201: identifier 'CONN' must be declared
PL/SQL: Statement ignored
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

quem é 'CONN' no seu programa ?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 15 visitantes