我正在使用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;
答案 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中工作。