Oracle APEX 4.2 经典报告中的自定义搜索
Posted
技术标签:
【中文标题】Oracle APEX 4.2 经典报告中的自定义搜索【英文标题】:Oracle APEX 4.2 Custom search in classic report 【发布时间】:2018-01-19 18:47:37 【问题描述】:我正在使用 Oracle APEX 4.2。我想在我的经典报告中实现搜索功能。我有一个可以检索数据的工作代码,并且搜索功能可以完美运行。但是,当我想在该代码中使用 order by 子句时,我得到“未找到数据”,如何在此代码中实现 order by 子句,以便我的报告将正确排序并且搜索功能仍将正常工作。
下面是允许您搜索经典报告的工作代码:
declare
a_query varchar2(5000);
this_strin varchar2(50);
begin
a_query := 'select flight_nmbr, sequence_nmbr'||
'from flights '||
'where sequence_nmbr >= 0'||
'and data_version_name = '''||
:P3_DATA_VERSION || '''';
if :P3_SEARCH_NUMBER is not null then
if instr(:P3_SEARCH_NUMBER, '%') > 0 then
this_strin := :P3_SEARCH_NUMBER;
else
this_strin := '%'||:P3_SEARCH_NUMBER||'%';
end if;
a_query := a_query||chr(10)||
' and flight_nmbr like '''|| upper(this_strin) ||'''';
end if;
return a_query;
end;
当我将 order by 子句添加到查询中时,这一段代码确实显示“未找到数据”:
declare
a_query varchar2(5000);
this_strin varchar2(50);
begin
a_query := 'select flight_nmbr, sequence_nmbr'||
'from flights '||
'where sequence_nmbr >= 0'||
'and data_version_name = '''||
'order by sequence_nmbr 1'|| ------------------Order by clause
:P3_DATA_VERSION || '''';
if :P3_SEARCH_NUMBER is not null then
if instr(:P3_SEARCH_NUMBER, '%') > 0 then
this_strin := :P3_SEARCH_NUMBER;
else
this_strin := '%'||:P3_SEARCH_NUMBER||'%';
end if;
a_query := a_query||chr(10)||
' and flight_nmbr like '''|| upper(this_strin) ||'''';
end if;
return a_query;
end;
【问题讨论】:
如果您使用 APEX 4.2,请不要使用标签oracle-apex-5
。令人困惑。
【参考方案1】:
很明显,你的问题就在这里:
begin
a_query := 'select flight_nmbr, sequence_nmbr'||
'from flights '||
'where sequence_nmbr >= 0'||
'and data_version_name = '''|| -- double qoute!!!
'order by sequence_nmbr 1'|| ------------------Order by clause
:P3_DATA_VERSION || '''';
由于多余的双引号,您的查询结果如下所示:
select flight_nmbr, sequence_nmbr
from flights
where sequence_nmbr >= 0
and data_version_name = 'order by sequence_nmbr 1<value of P3_DATA_VERSION item>';
只要表在data_version_name
列中没有值order by sequence_nmbr 1
,查询就不会返回任何行。
当你修复这个问题时你会遇到的第二个问题在这里:
if :P3_SEARCH_NUMBER is not null then
当此语句为true
时,您将获得一个查询,其中条件and flight_nmbr like ...
位于ORDER BY
子句之后。
顺便说一句,我建议您为报告编写一个简单的查询。动态生成 SQL 会导致此类错误,并且还会降低性能。
【讨论】:
【参考方案2】:与您的问题无关,但是 - 您为什么不切换到交互式报告?它提供的不仅仅是经典报告,您不觉得吗?
就你的问题而言:如果你查看失败的查询,它的 SELECT 看起来像这样(我已经删除了单引号):
and data_version_name = ||
order by sequence_nmbr 1 || ------------------Order by clause
:P3_DATA_VERSION ||
and flight_nmbr like upper(this_strin)
要么你没有发布实际代码,要么这通常是错误的 - 我希望你能看到 what 是错误的。 ORDER BY 应该是最后一个子句。此外,ORDER BY 末尾的那个“1”在做什么?
我建议您首先显示 A_QUERY 的内容,检查它是否工作正常(在 SQL*Plus、TOAD、SQL Developer 或您使用的任何其他工具中),并且 - 一旦您对它感到满意 - 让它在 Apex 中工作。
【讨论】:
以上是关于Oracle APEX 4.2 经典报告中的自定义搜索的主要内容,如果未能解决你的问题,请参考以下文章
从基于 PL/SQL 函数体返回 SQL 查询的 Oracle APEX 5 经典报告下载到 Excel 选项,