вторник, 16 мая 2017 г.

Комбинаторика в СУБД Oracle 11g

По запросу "oracle factorial" с ходу нагугливаются два подхода к вычислению факториала в СУБД Oracle:

  • самоочевидный: в цикле получить произведение натуральных чисел от 1 до n

    create or replace
    function fac1(n pls_integer) return number
    is
        f number := 1;
    begin
        if n in (0, 1) then
            return 1;
        end if;
        for i in 2..n loop
            f := f * i;
        end loop;
        return f;
    end fac1;
    /
    
  • забавный: вместо произведения натуральных чисел от 1 до n найти сумму их логарифмов, а затем возвести основание логарифма в найденную степень

    create or replace 
    function fac2(n pls_integer) return number
    is
        f number;
    begin
        select round(exp(sum(ln(level))))
        into f
        from dual
        connect by level <= n;
        return f;
    end fac2;
    /