0

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

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

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

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

现在,当用户选择“全部”以查看所有数据时,我需要删除AND IN DEPTNO IN (: p_deptno)部分(必须删除)。想象一下我有很多过滤器,我需要在未选中时删除所有过滤器。

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

我正在为我的数据库使用 Oracle。

4

1 回答 1

1

创建动态 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 -

    从 master_Territory 中选择区域

步骤 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')
于 2020-01-29T07:35:44.950 回答