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

时间:2018-01-19 18:47:37

标签: sql oracle plsql oracle-apex

我正在使用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;

2 个答案:

答案 0 :(得分:2)

显然,你的问题在这里:

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

只要表order by sequence_nmbr 1列中没有值data_version_name,查询就不会返回任何行。

当您修复此问题时,您将遇到的第二个问题是:

if :P3_SEARCH_NUMBER is not null then

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

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

答案 1 :(得分:1)

与您的问题无关,但是 - 为什么不切换到互动报告?它提供的不仅仅是经典报道,你认为不是吗?

截至您的问题:如果您查看失败的查询,其SELECT将如下所示(我已删除单引号):

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

要么您没有发布实际代码,要么这通常是错误的 - 我希望您在这里看到 错误。 ORDER BY应该是最后一个条款。此外,&#34; 1&#34;在ORDER BY结束时做什么?

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

相关问题