Oracle APEX - 将隐藏的 SQL 查询下载到 CSV 中

Oracle APEX - Download hidden SQL query into CSV

我正在尝试在我的应用程序的页面上创建一个按钮,该按钮将下载我引用的完整 table CSV 文件。我无法使用交互式报告 > 操作 > 下载 CSV,因为交互式报告有隐藏的列。我需要 all 列来填充 CSV 文件。

有没有办法创建 SQL 脚本并在按钮中引用它?

我已经尝试了此 link 中引用的步骤: 但它无济于事,因为我的查询将包含隐藏在交互式报表中的列。

欢迎使用 Whosebug!

一个灵活的选择是使用应用程序进程,在共享组件中定义(进程点 = ajax 回调)。 像这样:

declare 
    lClob clob;
    lBlob blob;
    lFilename varchar2(250) := 'filename.csv';
begin
    lClob := UNISTR('\FEFF'); -- was necessary for us to be able to use the files in MS Excel
    lClob := lClob || 'Tablespace Name;Table Name;Number of Rows' || utl_tcp.CRLF;

    for c in (select tablespace_name, table_name, num_rows from user_tables where rownum <= 5)
    loop
        lClob := lClob || c.tablespace_name || ';' || c.table_name || ';' || c.num_rows || utl_tcp.CRLF;
    end loop;

    lBlob := fClobToBlob(lClob);

    sys.htp.init;
    sys.owa_util.mime_header('text/csv', false);
    sys.htp.p('Conent-length: ' || dbms_lob.getlength(lBlob));
    sys.htp.p('Content-Disposition: attachment; filename = "' || lFilename || '"');
    sys.htp.p('Cache-Control: no-cache, no-store, must-revalidate');
    sys.htp.p('Pragma: no-cache');
    sys.htp.p('Expires: 0');
    sys.owa_util.http_header_close;
    sys.wpg_docload.download_file(lBlob);    

end;

这是函数 fClobToBlob:

create function fClobToBlob(aClob CLOB) RETURN BLOB IS
    tgt_blob BLOB;
    amount INTEGER := DBMS_LOB.lobmaxsize;
    dest_offset INTEGER := 1;
    src_offset INTEGER  := 1;
    blob_csid INTEGER := nls_charset_id('UTF8');
    lang_context INTEGER := DBMS_LOB.default_lang_ctx;
    warning INTEGER := 0;
begin
    if aClob is null then
        return null;
    end if;

    DBMS_LOB.CreateTemporary(tgt_blob, true);
    DBMS_LOB.ConvertToBlob(tgt_blob, aClob, amount, dest_offset, src_offset, blob_csid, lang_context, warning);
    return tgt_blob;
end fClobToBlob;

在页面上,您需要将按钮操作设置为 "Redirect to Page in this Application",目标页面设置为“0”。在 "Advanced" 下,将 Request 设置为 "APPLICATION_PROCESS=downloadCSV",其中 downloadCSV 是您的应用程序进程的名称。

如果您需要参数化您的流程,您可以通过访问您的申请流程中的页面项目或申请项目来实现。

生成 CSV 数据可能很麻烦,但有几个软件包可以使它更容易。 alexandria 包就是其中之一: https://github.com/mortenbra/alexandria-plsql-utils

有关如何使用 CSV 包的示例如下: https://github.com/mortenbra/alexandria-plsql-utils/blob/master/demos/csv_util_pkg_demo.sql