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

时间:2018-09-19 06:15:14

标签: oracle dynamic xml-publisher

如何根据用户的选择在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-bi-publisher/

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

1 个答案:

答案 0 :(得分:0)

创建动态SQL几乎不需要花招,而且需要多个步骤。主要思想是基于输入动态生成sql。如果用户选择任何参数,则只有“ WHERE”处于活动状态,否则它将处于非活动状态。

当您具有带有大表的复杂SQL并希望避免使用IN('All')类型的默认子句时,此方法可以高效地执行。这是一个三步过程,下面说明。

仅适用于Oracle DB。

步骤A.创建LOV-

  1. Concat-

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