Oracle Apex 经典报告 PL/SQL 函数体返回 SQL 查询

Oracle Apex Classic Report PL/SQL Function Body returning SQL Query

我有一个动态 SQL 查询,它基本上会为一年中的每个新星期添加一个新列。 查询中使用的 table 看起来像这样:

REP_NAME    WEEK
Amy 1
John    1
John    2
John    3
Nancy   1
Nick    1
Nick    2
Nick    3

为了使报告动态化(在 table 更新后每周添加一个新列(也是每周一次))我正在使用“'PL/SQL Function Body returning SQL Query'”选项在经典报告中找到。 为此,我之前创建了一个函数:

create or replace Function my_Testing_table_function
   RETURN varchar2
IS
v_stmt varchar2(5000);
v_my_week number;

begin
v_stmt :='with initial_data as(
select distinct
       Rep_name
  from my_testing_table
  order by 1
)' ;
for i in (select distinct week from my_testing_table ) loop
    v_stmt := v_stmt || ', week_'|| i.week || ' as(
select 
Rep_name,
count(unique_j) unique_'|| i.week ||
'
from my_testing_table
where week = ' || i.week || ' 
group by week, Rep_name
)';
end loop; 
v_stmt := v_stmt || ' select
b.Rep_name';
for i in (select distinct week from my_testing_table) loop
    v_stmt := v_stmt || ', unique_'|| i.week || ' as Week_' || i.week ;
end loop; 
    v_stmt := v_stmt || ' from initial_data b';
for i in (select distinct week from my_testing_table) loop
    v_stmt := v_stmt || ' left join week_'|| i.week || ' wk'|| i.week || ' on wk'||i.week 
||'.Rep_name = b.Rep_name';
end loop;

return v_stmt;
end;

这功能 returns 我想要的查询,但是,当用于我的经典报告时...没有结果。显然我遗漏了一些东西,但不知道它是什么。有人可以请教一下吗?

生成经典报告:

嗯,是的 - 动态创建的报告看起来 聪明 ,但是 - 从我的角度来看,我会继续使用更 经典 方法 - 一个简单且易于维护的查询,如下所示:

SQL> select rep_name,
  2    count(case when week = 1 then unique_j end) w1,
  3    count(case when week = 2 then unique_j end) w2,
  4    count(case when week = 3 then unique_j end) w3
  5  from my_testing_table
  6  group by rep_name
  7  order by rep_name;

REP_N         W1         W2         W3
----- ---------- ---------- ----------
Amy            1          0          0
John           1          1          1
Nancy          1          0          0
Nick           1          1          1

SQL>

是的,它需要一点 copy/pasting(其中 52 行 COUNT 一年有 52 周)并且让你想知道“等一下,是吗 必须看起来那么愚蠢吗?”,但是-正如我所说,它不仅简单而且每个人都很容易理解(即使是那些有一天会继承您的代码的开发人员)。你写的函数是 smart,但我真的不想有一天调试它。我发布的查询 微不足道 且易于修复。

现在就看你的了;我只是将查询放入经典报告的来源。

只需使用

RETURN my_Testing_table_function();

在您的示例中,您向 APEX 请求 return 查询文本作为来自 DUAL.

的单个值