经典报表中的 Oracle Apex 5.0 自定义搜索

Oracle Apex 5.0 Custom Search in Classic Report

我正在使用 Oracle APEX 5.0,我正在尝试基于多个条件(例如(从日期、到日期、序列和 Emp 名称(从列表中选择和 returns ID)), 我写了这样的条件:

where   emp_id = nvl(:P73_EMP_ID,emp_id)

or      ror_serial like nvl('%'||:P73_SERIAL||'%',ror_serial)`

or      ror_effective_date between to_date(:P73_FROM_DATE) and to_date(:P73_TO_DATE)

and     ror_approved_flag = 'N'

问题是我需要基于一个或多个条件的搜索,这意味着我可能会留下一些空的项目,如果所有项目都是空的,我需要显示整个记录,谢谢帮助。

有两种方法可以做到这一点:

1。 "Quick and Dirty" 方式

只要您处理性能不会成为问题的小型数据集,这就很好。 只需在您的条件中允许空值,例如

 and (:P73_FROM_DATE is null or ror_effective_date >= to_date(:P73_FROM_DATE))
 and (:P73_FROM_DATE is null or ror_effective_date <= to_date(:P73_TO_DATE))

等等。

2。动态 SQL

这对于性能可能成为问题的较大数据集更好。 将报告源类型更改为 "PL/SQL function returning SQL query"。 然后将源更改为如下所示

declare
   q long;
begin
   -- The query with any conditions always applied
   q := 'select a, b, c from mytable where ror_approved_flag = ''N''';

   -- Append any optional conditions
   if :P73_FROM_DATE is not null then
      q := q || ' and ror_effective_date >= to_date(:P73_FROM_DATE)';
   end if;
   -- etc.

   return q;
end;

这将导致根据您的条件生成适当的查询。这意味着 Oracle 可以根据条件选择最合适的查询计划。

交互式报表可以这样。您可以过滤并使用多个过滤器。您也可以保存报告。它以最少的 sql 知识满足您的所有要求。

不知道您的查询有多复杂,但如果您需要更改查询的语法,那么唯一的方法就是使用一些 pl/sql 逻辑准备语句。

另请查看 APEX 第 35 页中的 P-Track 等示例应用程序 - 里程碑,它可以为您提供一些准备其余部分的想法。