Oracle APEX 4.2 经典报表中的自定义搜索

Oracle APEX 4.2 Custom search in classic report

我正在使用 Oracle APEX 4.2。我想在我的经典报告中实现搜索功能。我有一个检索数据的工作代码,搜索功能运行良好。但是,当我想在该代码中使用 order by 子句时,我得到 "no data found" 如何在该代码中实现 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 子句添加到查询中时,这里是 "no data found" 的同一段代码:

 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;

与您的问题无关,但是 - 为什么不切换到交互式报告?它提供的不仅仅是一份经典报告,你不觉得吗?

关于你的问题:如果你查看失败的查询,它的 SELECT 看起来像这样(我已经删除了单引号):

and data_version_name =  ||
order by sequence_nmbr 1 || ------------------Order by clause
:P3_DATA_VERSION         || 
and flight_nmbr like upper(this_strin)

要么您没有 post 实际代码,要么这通常是错误的 - 我希望您看到 这里有什么错误。 ORDER BY 应该是最后一个子句。此外,ORDER BY 末尾的“1”是做什么的?

我建议您先显示 A_QUERY 的内容,检查它是否正常工作(在 SQL*Plus、TOAD、SQL Developer 或任何其他工具中使用),并且 - 一旦您对它感到满意 - 让它在 Apex 中工作。

显然,你的问题在这里:

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>';

只要 table 在列 data_version_name 中没有值 order by sequence_nmbr 1,查询 returns 就没有行。

你在修复这个问题时会遇到的第二个问题是:

if :P3_SEARCH_NUMBER is not null then

当此语句为 true 时,您将得到一个查询,其中条件 and flight_nmbr like ... 位于 ORDER BY 子句之后。

顺便说一句,我建议您为报告编写一个简单的查询。动态生成 SQL 会导致此类错误并降低性能。