2021年12月9日木曜日

WPG_DOCLOAD.DOWNLOAD_FILEの代わりにAPEX_DATA_EXPORT.DOWNLOADを使用する

 Oracle Databaseが提供しているWPG_DOCLOAD.DOWNLOAD_FILEを、Oracle APEXが提供しているAPEX_DATA_EXPORT.DOWNLOADに置き換えてみます。両方ともマニュアルに記載があるパッケージなので、どちらを利用しても良いでしょう。

テキストとして

吾輩は猫である。
名前はまだ無い。

をダウンロードするコーディングを行います。

APEX_DATA_EXPORT.DOWNLOADでは以下の書き方になります。

declare
    l_clob clob;
    l_download apex_data_export.t_export;
begin
    l_clob := 
q'~吾輩は猫である。
名前はまだ無い。
~';
    l_download.file_name := 'mytest';
    l_download.format := 'TXT';
    l_download.mime_type := 'text/plain';
    l_download.as_clob := TRUE;
    l_download.content_clob := l_clob;
    apex_data_export.download( p_export => l_download );
    apex_application.stop_apex_engine;
end;

WPG_DOCLOAD.DOWNLOAD_FILEでは以下の書き方になります。

declare
    l_blob blob;
    l_clob clob;
begin
    l_clob := 
q'~吾輩は猫である。
名前はまだ無い。
~';
    l_blob := wwv_flow_utilities.clob_to_blob(
        p_clob => l_clob
        , p_charset => 'AL32UTF8'
        , p_include_bom => FALSE
    );
    sys.htp.init;
    sys.htp.p('Content-Length: ' || dbms_lob.getlength(l_blob));
    sys.htp.p('Content-Type: text/plain');
    sys.htp.p('Content-Disposition: attachment; filename=mytest.txt');
    sys.owa_util.http_header_close;
    sys.wpg_docload.download_file(l_blob);
    apex_application.stop_apex_engine;
end;

上記のプロシージャをAjaxプロセスとして呼び出すAPEXアプリケーションのエクスポートを以下に置きました。

https://github.com/ujnak/apexapps/blob/master/exports/file-download-api.sql

以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。