为什么 APEX Collection 无法构建?

Why won't APEX Collection build?

我使用 2 个 APEX 集合来 运行 查询,然后在我页面的多个区域中使用它们来显示不同的数据子集。第一个是主要查询,第二个只是根据人口统计特征聚合整个数据集。

第二个足够长,我必须将它拆分为 2 个隐藏项,然后将它们连接到我的 PL/SQL 函数体中。我以前做过多次,但这次查询不会 运行。我怀疑这是由于串联发生的方式所致,但我无法理解为什么或如何解决它。

这里是代码示例 (t运行cated):

<!--hidden item 1, P623057_TOTALS_Q-->
select gender as group_label,
    'gender' as category,
    count(gender) as total,
    0 as schoolid
from staff
group by gender
union

<!--hidden item 2, P623057_TOTALS_Q2-->
select ethnicity,
    'ethnicity' as category,
    count(ethnicity),
    0 as schoolid
from staff
group by ethnicity

还有我的 PL/SQL 函数:

DECLARE
    l_query varchar2(32767) := :P623057_TOTALS_Q || :P623057_TOTALS_Q2;
begin
    IF APEX_COLLECTION.COLLECTION_EXISTS (p_collection_name => 'DEMTOT') THEN
            APEX_COLLECTION.DELETE_COLLECTION (p_collection_name => 'DEMTOT');
    end if;
    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B (
        p_collection_name => 'DEMTOT', 
        p_query => l_query);
End;

我试过:

有一次它在将 CR/LF 添加到 P623057_TOTALS_Q2 后工作,但是一旦我重新加载页面它就停止工作了。

我得到的错误是: ora_sqlerrm: ORA-20104: create_collection_from_query_b Error:ORA-20104: create_collection_from_query ParseErr:ORA-00933: SQL command not properly ended ORA-06512。我已验证查询有效。

我已经有点放弃了,只是让导致我的总计查询的聚合在使用它的区域变得太大 运行,但我很想知道它为什么这样做这个以及我可以做些什么来解决它。

谢谢!

如果您的代码变得太大,那么建议将代码移动到包中。 下面是一个程序包中的过程示例,它根据 emp/dept 示例数据集填充集合。重命名为对您的应用程序有用的名称。

  1. 创建包
create or replace package mypkg AS
  PROCEDURE P1_POPULATE_COLLECTION;
END mypkg;
/

CREATE OR REPLACE
PACKAGE BODY MYPKG AS

  PROCEDURE P1_POPULATE_COLLECTION AS
      l_query varchar2(32767) := q'!SELECT ename, 'gender' as category FROM EMP!';
  BEGIN
      IF APEX_COLLECTION.COLLECTION_EXISTS (p_collection_name => 'EMP') THEN
              APEX_COLLECTION.DELETE_COLLECTION (p_collection_name => 'EMP');
      END IF;
      APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B (
          p_collection_name => 'EMP', 
          p_query => l_query);
  END P1_POPULATE_COLLECTION;

END MYPKG;
/
  1. 添加页面进程

添加类型为 pl/sql 的页眉前流程,代码为

mypkg.p1_populate_collection;

在页面项目中放置查询可能会起作用,但我根本不会称之为好的做法。我的建议是加快速度 pl/sql - 这一点都不难,它会让你作为 apex 开发人员的生活 轻松很多。如果你卡住了,总会有堆栈溢出 ;)