Ваше решение заключается в использовании конвейерной табличной функции для возврата ваших комбинаций.
Ваша функция может находиться в своем собственном пакете (с состоянием пакета), который возвращает нужные вам данные в нужном вам порядке. Состояние должно быть набором переменных, определяемых числом возвращаемых столбцов, инициализированных начальными начальными значениями (A = 1, B = A + 1, C = B + 1, D = C + 1 и т. Д.). Тогда вы просто
PIPE ROW(a,b,c,d);
-- increment D
-- if D overflow limit, increment C and re-init D to C+1
-- if C overflow limit-1, increment B and re-init C to B+1
-- if B overflow limit-2, increment A and re-init B to A+1
-- if A overflow limit-3, the end
Это выходы, для N = 6
1,2,3,4
1,2,3,5
1,2,3,6
1,2,4,5
1,2,4,6
1,3,4,5
1,3,4,6
2,3,4,5
2,3,4,6
2,3,5,6
3,4,5,6