Oracle
 sql >> Database >  >> RDS >> Oracle

APEX:scarica BLOB dalla tabella temporanea

Prova ad aggiungere apex_application.stop_apex_engine dopo il wpg_docload chiamata. Ciò eviterà ulteriore output di intestazioni HTTP, potenzialmente rovinando il download perché viene generato ulteriore codice apice.

  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;

Inoltre, per approfondire :

Sì. Ma non necessariamente nel tuo caso. È importante ricordare come funziona Apex per quanto riguarda le sessioni del database. Apex è senza stato e funziona con il pool di connessioni. Una sessione Apex generalmente non corrisponde a 1 sessione di database e non è mai garantito che, ad esempio, venga utilizzata la stessa sessione di database tra il rendering e l'elaborazione. Questo è anche brevemente menzionato nella documentazione su Comprensione della gestione dello stato della sessione , copiato per comodità:

Nel caso di una tabella temporanea globale, ciò significa che è inutile utilizzarla in molti casi poiché i dati esisteranno solo in quella sessione di database corrente. Un esempio di ciò è dove si caricano i dati in un GTT da qualche parte nell'onload e si intende utilizzarli nei processi di post-invio o in una chiamata ajax. È molto probabile che il tavolo sia vuoto.
Apex fornisce tuttavia un'alternativa sotto forma di raccolta_apex , che conterrà temporaneamente i dati all'interno di una determinata sessione apicale.