Oracle
 sql >> Base de données >  >> RDS >> Oracle

APEX :Télécharger le BLOB à partir de la table temporaire

Essayez d'ajouter apex_application.stop_apex_engine après le wpg_docload appel. Cela évitera de générer davantage d'en-têtes HTTP, ce qui pourrait gâcher votre téléchargement car un code apex supplémentaire est généré.

  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;

De plus, pour développer :

Oui. Mais pas forcément dans ton cas. Il est important de se souvenir du fonctionnement d'apex en ce qui concerne les sessions de base de données. Apex est sans état et fonctionne avec le regroupement de connexions. Une session apex ne correspond généralement pas à une session de base de données et vous n'êtes jamais assuré que, par exemple, la même session de base de données est utilisée entre le rendu et le traitement. Ceci est également brièvement mentionné dans la documentation sur Comprendre la gestion de l'état de session , copié pour plus de commodité :

Dans le cas d'une table temporaire globale, cela signifie qu'il est inutile de l'utiliser dans de nombreux cas puisque les données n'existeront que dans cette session de base de données en cours. Un exemple de ceci est le cas où l'on chargerait des données dans un GTT quelque part dans le onload et les moyens de les utiliser dans les processus après soumission ou un appel ajax. Il y a de fortes chances que la table soit vide.
Apex fournit cependant une alternative sous la forme de apex_collection , qui conservera temporairement les données au cours d'une session apex donnée.