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
.
的单个值
我有一个动态 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
.