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