如何根据用户的选择在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作为数据库。
答案 0 :(得分:0)
创建动态SQL几乎不需要花招,而且需要多个步骤。主要思想是基于输入动态生成sql。如果用户选择任何参数,则只有“ WHERE”处于活动状态,否则它将处于非活动状态。
当您具有带有大表的复杂SQL并希望避免使用IN('All')
类型的默认子句时,此方法可以高效地执行。这是一个三步过程,下面说明。
仅适用于Oracle DB。
步骤A.创建LOV-
Concat-
SELECT ''''||ABCD||'''' FROM (
SELECT LISTAGG( COLUMN_VALUE,''',''') WITHIN GROUP (ORDER BY 1) as ABCD
FROM TABLE(sys.ODCIVARCHAR2LIST(:prmTerritory)))
断裂-
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'''
领土的普通LOV-
从master_Territory中选择地区
步骤B.0创建以下参数-请注意我们如何在SQL中使用这些参数。显示参数-
隐藏参数-
步骤B.1将所有这些参数添加到源数据库到过程中。
步骤C.使用上述参数创建SQL-
查询:
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')