在 BI Publisher 12c 中创建动态 SQL Where 子句

Create Dynamic SQL Where clause in BI Publisher 12c

如何根据用户的选择在 BI Publisher 12c 中动态修改 SQL?

我有一个要求,我需要应用多个 BIP 参数。现在,如果用户在参数中传递一些东西,应用它是有意义的,但如果用户让 'All' 值通过提示传递,它会使 SQL 非常慢。

这是我们如何在数据模型中使用参数的示例-

SELECT DEPTNO FROM DEPT WHERE 1=1 AND IN DEPTNO IN (: p_deptno)

现在,当用户选择 'All' 查看所有数据时,我需要删除 AND IN DEPTNO IN (: p_deptno) 部分(必须删除)。想象一下,我有很多过滤器,如果没有选择,我需要删除所有过滤器。

我在这里看到了对旧 BIP 的一些帮助,但对新 12 版本没有任何帮助(根据以下 link:https://only4techies.wordpress.com/2009/12/12/how-to-use-conditional-sql-statements-in-bi-publisher/

我的数据库使用 Oracle。

创建动态 SQL 需要一些技巧和多个步骤。主要思想是根据输入动态生成 sql。如果用户选择任何参数,则只有 'WHERE' 处于活动状态,否则它将处于非活动状态。

当您有复杂的 SQL 大表并且您想避免 IN('All') 种默认子句时,这会有效执行。这是一个三步过程,解释如下。

仅适用于 Oracle 数据库。

步骤 A. 创建 LOV -

  1. 连接-

    SELECT ''''||ABCD||'''' FROM (
         SELECT LISTAGG(  COLUMN_VALUE,''',''') WITHIN GROUP (ORDER BY 1) as ABCD
    FROM TABLE(sys.ODCIVARCHAR2LIST(:prmTerritory)))
    
  2. 中断-

    Select ' AND 1=1' from dual where :prmTerritoryConcat=''''''  OR   :prmTerritoryConcat = '''All'''
    union all 
    select '  AND  orig_table.Territory IN ('||  :prmTerritoryConcat ||')'  from dual where :prmTerritoryConcat  <>  '''''' AND  :prmTerritoryConcat <> '''All'''
    
  3. 区域的正常 LOV -

    Select 来自 master_Territory

  4. 的领土

步骤 B.0 创建以下参数 - 请注意我们如何在 SQL 中使用这些参数。显示参数-

  1. parTerritory - 设置为 #3

隐藏参数-

  1. parTerritoryBreak - 设置为 #2
  2. parTerritoryConcat - 设置为 #1

步骤 B.1 将所有这些参数添加到源数据库到一个过程中。

步骤 C. 使用上述参数创建 SQL -

  1. 查询:

    SELECT Territory 
    from original_table original_table 
    WHERE 
    &parTerritoryBreak
    

测试用例 - 我考虑了以下两种情况。检查正在创建的 sql BIP 的输出日志。对于这两种情况,日志应显示如下 - 情况 1 - 未选择领土时 -

SELECT Territory 
from original_table original_table 
WHERE 
1=1

案例 2 - 选择地区时 -

SELECT Territory 
from original_table original_table 
WHERE 1=1 
AND orig_table.Territory IN ('Americas', 'EMEA', 'APAC')