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

Posted

技术标签:

【中文标题】Oracle APEX - 将隐藏的 SQL 查询下载到 CSV【英文标题】:Oracle APEX - Download hidden SQL query into CSV 【发布时间】:2019-08-19 23:34:37 【问题描述】:

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

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

我已经尝试了此链接中引用的步骤:Oracle APEX - Export a query into CSV using a button,但这并没有帮助,因为我的查询将包含隐藏在交互式报告中的列。

【问题讨论】:

也许要考虑的一种方法是在报告中添加一些不可隐藏的列。您可以将“隐藏”属性设置为“否”,这样用户就无法隐藏它们。然后,在 Request 为 NULL 的地方添加一个 Condition;这样一来,这些列就不会在网页上呈现,但它们会出现在任何下载中。 嗨 Jeffrey - 我将如何添加条件 Request is NULL PL/SQL: :request is null 【参考方案1】:

欢迎来到 ***!

一个灵活的选择是使用应用程序进程,在共享组件中定义(进程点 = 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;

在页面上,您需要将按钮操作设置为“重定向到此应用程序中的页面”,目标页面为“0”。在“高级”下,将请求设置为“APPLICATION_PROCESS=downloadCSV”,其中downloadCSV 是您的应用程序进程的名称。

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

生成 CSV 数据可能很麻烦,但有几个软件包可以让这变得更容易。亚历山大包是其中之一: https://github.com/mortenbra/alexandria-plsql-utils

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

【讨论】:

感谢 Thomas - 经过反复试验,我能够让这个解决方案为我工作。再次感谢您! 不客气。如果您需要更多帮助,请随时提出更多问题。

以上是关于Oracle APEX - 将隐藏的 SQL 查询下载到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL 查询中一个字段的值用于 Oracle Apex 上另一个字段的值列表?

在 oracle apex 中将 sql 查询重写为 pl/sql

不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名

Apex Oracle 中的 SQL 多对多查询

在 Oracle APEX PL/SQL 中传递变量

如何在 oracle apex 18 中编辑交互式网格(带有复杂的 sql 查询)?