Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

APEX:Baixe o BLOB da tabela temporária


Tente adicionar apex_application.stop_apex_engine após o wpg_docload ligar. Isso evitará mais saída de cabeçalhos HTTP, potencialmente atrapalhando seu download porque mais código Apex é gerado.
  owa_util.mime_header( nvl(v_mime,'application/octet'), FALSE );
  htp.p('Content-length: ' || v_length);
  htp.p('Content-Disposition:  attachment; filename="'||replace(replace(substr(v_file_name,instr(v_file_name,'/')+1),chr(10),null),chr(13),null)|| '"');
  owa_util.http_header_close;
  wpg_docload.download_file( Lob_loc );
  apex_application.stop_apex_engine;

Além disso, para detalhar:

Sim. Mas não necessariamente no seu caso. É importante lembrar como o apex funciona em relação às sessões do banco de dados. O Apex é sem estado e funciona com pool de conexões. Uma sessão do apex geralmente não corresponde a 1 sessão de banco de dados e você nunca garante que, por exemplo, a mesma sessão de banco de dados seja usada entre renderização e processamento. Isso também é mencionado brevemente na documentação em Noções básicas sobre o gerenciamento do estado da sessão , copiado por conveniência:

No caso de uma tabela temporária global, isso significa que é inútil usá-la em muitos casos, pois os dados existirão apenas na sessão atual do banco de dados. Um exemplo disso é onde alguém carregaria dados em um GTT em algum lugar no onload e significa usá-lo nos processos após o envio ou em uma chamada ajax. Grande chance de a tabela estar vazia.
O Apex, no entanto, fornece uma alternativa na forma de apex_collection , que reterá temporariamente os dados em uma determinada sessão do apex.