【问题标题】:How to create an interactive report using pl/sql refcursor如何使用 pl/sql refcursor 创建交互式报告
【发布时间】:2014-03-03 10:03:33
【问题描述】:

我需要创建一个交互式报告,但我需要运行 pl/sql 语句而不是运行 sql 语句

-----------------------------------------------------------------------------
USER_ID        Name                 1 java 2 php 3 pl/sql / sql 4 Oracle apex
-------------- -------------------- ------ ----- -------------- -------------
3              Amy brown            N      N     Y              N           
4              Sarah woods          N      N     Y              Y           
2              Johnny paterson      Y      Y     Y              Y           
1              John brown           Y      N     Y              Y   

如果在 apex 中无法做到这一点,那么当您运行 pl/sql 时,有没有办法将该 pl/sql 语句的结果保存为 csv 格式?

在交互式报告中,用户将无法添加或删除任何内容。仅供观赏。

谢谢

【问题讨论】:

标签: plsql oracle10g oracle-apex sys-refcursor


【解决方案1】:

正如 Scott 所说,一种选择是使用 refcursor 创建一个 APEX 集合,然后使用 APEX_COLLECTIONS 视图从数据中创建一个交互式网格。我已经构建了一个示例来演示这一点。

在页眉之前的位置创建一个预渲染进程。使用此方法,您可以添加额外的逻辑以在集合已存在的情况下不重新填充数据,或者每次用户刷新其页面时不会刷新数据。

Set up of Pre-Rendering Process

填充集合的源代码:

DECLARE
    l_ref_cur      SYS_REFCURSOR;

    TYPE user_skill_rec IS RECORD
    (
        user_id        NUMBER,
        name           VARCHAR2 (100),
        java           VARCHAR2 (1),
        php            VARCHAR2 (1),
        plsql_sql      VARCHAR2 (1),
        oracle_apex    VARCHAR2 (1)
    );

    l_user_skill   user_skill_rec;

    FUNCTION get_ref_cursor
        RETURN SYS_REFCURSOR
    IS
        l_cur   SYS_REFCURSOR;
    BEGIN
        OPEN l_cur FOR
            SELECT 3               AS user_id,
                   'Amy brown'     AS name,
                   'N'             AS java,
                   'N'             AS php,
                   'Y'             AS plsql_sql,
                   'N'             AS oracle_apex
              FROM DUAL
            UNION ALL
            SELECT 4 AS user_id, 'Sarah woods', 'N', 'N', 'Y', 'Y' FROM DUAL
            UNION ALL
            SELECT 2 AS user_id, 'Johnny paterson', 'Y', 'Y', 'Y', 'Y' FROM DUAL
            UNION ALL
            SELECT 1 AS user_id, 'John brown', 'Y', 'N', 'Y', 'Y' FROM DUAL;

        RETURN l_cur;
    END;
BEGIN
    l_ref_cur := get_ref_cursor;

    apex_collection.create_or_truncate_collection ('USER_SKILLS');

    LOOP
        FETCH l_ref_cur INTO l_user_skill;

        EXIT WHEN l_ref_cur%NOTFOUND;
        apex_collection.add_member (p_collection_name   => 'USER_SKILLS',
                                    p_n001              => l_user_skill.user_id,
                                    p_c001              => l_user_skill.name,
                                    p_c002              => l_user_skill.java,
                                    p_c003              => l_user_skill.php,
                                    p_c004              => l_user_skill.plsql_sql,
                                    p_c005              => l_user_skill.oracle_apex);
    END LOOP;
END;

然后,只需使用填充了数据的同一集合创建查询 APEX_COLLECTIONS 视图的交互式报表:

Setup of Interactive Report

来源查询:

select n001, c001, c002, c003, c004, c005
  from apex_collections
 where collection_name = 'USER_SKILLS'

【讨论】:

    【解决方案2】:

    你可以使用表函数

    https://mfaisal1521.blogspot.com/2019/12/example-of-oracle-pipelined-function.html

    在 Apex 中也可以导出数据。如果您尝试导出数据,您可以使用 utl_File 但在您的数据库服务器上导出数据。

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多