2015-03-18 2 views
0

В каком сценарии рекурсию можно использовать в PL/SQLРекурсивных функций в PL/SQL ORACLE

CREATE OR REPLACE FUNCTION factorial (
    n POSITIVE 
) RETURN POSITIVE 
IS 
BEGIN 
    IF n = 1 THEN 
    RETURN n; 
    ELSE 
    RETURN n * factorial(n-1); 
    END IF; 
END; 
BEGIN 
    FOR i IN 1..5 LOOP 
    DBMS_OUTPUT.PUT_LINE(i || '! = ' || factorial(i)); 
    END LOOP; 
END; 

Это будет работать, но я хочу знать, в реальном мире, когда рекурсия требуется в базе данных запросов

+0

Ваш пример кода PL/SQL, а не запрос. –

ответ

2

Зависит от того, что вы подразумеваете под «обязательным». Рекурсивный алгоритм всегда можно переписать в виде цикла, и цикл всегда можно переписать в виде рекурсивного алгоритма (предполагая, что язык, с которым вы работаете, поддерживает как петли, так и вызовы функций). Некоторые алгоритмы, как правило, проще реализовать с помощью рекурсии, другие, как правило, легче реализовать с помощью циклов.

Использование рекурсии для вычисления факториалов в PL/SQL является разумным выбором реализации. Использование цикла также было бы разумным. Если вы хотите сделать это в чистом SQL, а не прибегая к PL/SQL, вы можете также

select round(exp(sum(ln(level)))) 
    from dual 
connect by level <= <<some number>> 

Какой из различных разумных реализаций, которые вы используете, зависит от различных factors-- какой подход вы наиболее комфортно , скорость различных реализаций и т. д.

+0

Что он сказал. Я бы добавил только, что afaik, единственное место рекурсии на самом деле требуется в рекурсивном CTE. Довольно странно. – TommCatt

+0

hey tomm can u объяснить, что такое CTE –

+1

@BrijanElwadhi - CTE - это общее табличное выражение - что-то в предложении 'with' инструкции SQL. Конкретным подмножеством CTE являются рекурсивные CTE - CTE, который вызывает себя. Большинство запросов с использованием рекурсивных CTE пересекают иерархию, и в этом случае вы также можете использовать предложение 'connect by'. Для примеров рекурсивных CTE, https://blogs.oracle.com/sql/entry/converting_common_table_expressions_from –

Смежные вопросы