在 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 -
连接-
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 -
Select 来自 master_Territory
的领土
步骤 B.0 创建以下参数 - 请注意我们如何在 SQL 中使用这些参数。显示参数-
- parTerritory - 设置为 #3
隐藏参数-
- parTerritoryBreak - 设置为 #2
- parTerritoryConcat - 设置为 #1
步骤 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')
如何根据用户的选择在 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 -
连接-
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 -
Select 来自 master_Territory
的领土
步骤 B.0 创建以下参数 - 请注意我们如何在 SQL 中使用这些参数。显示参数-
- parTerritory - 设置为 #3
隐藏参数-
- parTerritoryBreak - 设置为 #2
- parTerritoryConcat - 设置为 #1
步骤 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')