Försök att lägga till apex_application.stop_apex_engine efter wpg_docload
ringa upp. Detta kommer att undvika ytterligare utmatning av HTTP-rubriker, vilket potentiellt försämrar din nedladdning eftersom ytterligare apex-kod genereras.
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;
Dessutom, för att utveckla :
Ja. Men inte nödvändigtvis i ditt fall. Det är viktigt att komma ihåg hur apex fungerar med avseende på databassessioner. Apex är tillståndslöst och fungerar med anslutningspoolning. En apex-session stämmer i allmänhet inte överens med 1 databassession, och du är aldrig garanterad att till exempel samma databassession används mellan rendering och bearbetning. Detta nämns också kort i dokumentationen på Förstå Session State Management , kopierad för enkelhetens skull:
I fallet med en global temporär tabell betyder detta att den är meningslös att använda i många fall eftersom data endast kommer att finnas i den aktuella databassessionen. Ett exempel på detta är där man skulle ladda data i en GTT någonstans i onloaden och innebär att använda den i processerna efter att skicka in eller ett ajax-samtal. Stor chans att tabellen blir tom.
Apex erbjuder dock ett alternativ i form av apex_collection
, som tillfälligt kommer att hålla data inom en given apex-session.