Limite utl_http com varchar2

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
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

Galera boa tarde.

No processo de NFe estamos utilizando o utl_http.
Até então não tinhamos problema, ate que houve a necessidade de gerar uma nota fiscal gigante, onde a mesma teria +- 60.000 caracteres.
Dai saimos alterando tudo para clob nossas variaaveis, mas tivemos um problema: chega determinado momento que batemos na package utl_http, e ela possui procedures, por exemplo, write_text que recebe um varchar2 com o corpo do xml...

alguém sabe se há uma forma de eu alterar a package utl_http, ou utilizar algum outro recurso???


desde já grato.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Já tive que realizar algo parecido para envio de e-mails, com o UTL_SMTP...
No caso, foi só ler o LOB particionado de n em n bytes em um loop, chamando o UTL_SMTP.WRITE_RAW.

O UTL_HTTP possui as procedures WRITE e WRITE_LINE, que provavelmente permitirão o envio dos dados.

Seria algo assim:

Selecionar tudo

-- declaração do lob, abertura da conexão, etc..
-- ...
pos_inicial := 1;
tam_buffer  := 2000;
tam_lob     := dbms_lob.getlength( lob );

while ( pos_inicial <= least( tam_lob, 2000 ) ) loop
  utl_http.write( conexao, dbms_lob.substr( lob, tam_buffer, pos_inicial ) );
  pos_inicial := pos_inicial + tam_buffer ;
end loop;
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ops... seria UTL_HTTP.WRITE_TEXT no lugar de UTL_HTTP.WRITE
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

vle jovem...

vou fazer os testes aqui desta forma e logo em seguida eu posto os resultados...


abrçs
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

olha muito esquisito, movi um arquivo texto de 10 MB utilizando apenas o write text... sem precisar de loop sem nada...

vai entender... provavelmente a package utl_http deve ser inteligente e, por eu ter instanciado com CLOB, ela já deve trabalhar com lobs..

vlw...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

E no outro lado recebeu o conteúdo completo? Não recebeu apenas uma versão "cortada"?

O Write_text não é sobrecarregado para varchar2 ou Clob, é apenas varchar2 e, dessa forma, não deveria enviar mais do que 32.676 caracteres por chamada.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

pior que ele enviou... tmb não me pergunte rs... foi td bem...
tmb achei estranho pois ele recebe um varchar2 como parametro para escrever o texto, porem eu mando uma variavel tipo clob

vou fazer mais alguns acompanhamentos.... mais já movi um arquivo de 31MB com aproximadamente 1.000.000 de caracteres e ele foi rapidim...

só froyd expplica..

vou comentando como vai saindo... agora estou com este problema de cortar conteudo nos response das mensagens do webservice...

vou alterando e vou postando o que vou fazendo aqui... vamos ver...


agora se alguém conhecer uma area de exatas que não tem nada de exato igual a programacao me fala.. porque eu to doido com essas incognitas... to achando que programacao ta mais ligado a area de religiao e teologia do que exatas.. é só ter fé q funciona...

abrçs
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

olha acabou que dando certo

seguindo os conselhos do rogenaro eu mandei um loop tanto para escrita (write_text) para enviar dados ao webservice como para leitura (read_text) para receber o envelope do web_service...

Selecionar tudo

  l_http_response := UTL_HTTP.get_response(l_http_request);
  DBMS_LOB.CREATETEMPORARY(aux1,TRUE);
  loop
    UTL_HTTP.read_text(l_http_response, l_envelope);
    dbms_lob.writeappend(aux1,length(l_envelope),l_envelope);
    exit when length(l_envelope) < 32767;
  end loop;
vlw galera....
Responder
  • Informação