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 经典报告中的自定义搜索的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX 18 - 经典报告错误缓冲区小

Oracle APEX 中的卡片报告

从基于 PL/SQL 函数体返回 SQL 查询的 Oracle APEX 5 经典报告下载到 Excel 选项,

在交互式网格 Oracle Apex 中的自定义验证中突出显示列

在 Oracle APEX 中访问报表输出表

Oracle Apex - 更改图表标签