Не генерируйте все значения, просто используйте BETWEEN
:
SELECT *
FROM table
WHERE fyr_actg_prd BETWEEN TO_CHAR( ADD_MONTHS( :input_date, -2 ), 'YYYYMM' )
AND TO_CHAR( :input_date, 'YYYYMM' )
Если вы хотите создать значения, вы можете использовать иерархический запрос:
SELECT *
FROM table_name
WHERE fyr_actg_prd IN (
SELECT TO_CHAR( ADD_MONTHS( :input_date, LEVEL - 3 ), 'YYYYMM' )
FROM DUAL
CONNECT BY LEVEL <= 3
);
илирекурсивный подзапрос:
WITH months ( month, idx ) AS (
SELECT TO_CHAR( :input_date, 'YYYYMM' ),
1
FROM DUAL
UNION ALL
SELECT TO_CHAR( ADD_MONTHS( :input_date, -idx ), 'YYYYMM' ),
idx + 1
FROM months
WHERE idx < 2
)
SELECT *
FROM table_name
WHERE fyr_actg_prd IN ( SELECT month FROM months );