Опережающие объявления в PL/SQL: рекурсия и взаимная рекурсия

Опережающие объявления, рекурсия в PL/SQLЯзык PL/SQL требует, чтобы элементы были объявлены до того, как они будут ис­пользоваться в коде программы. Но как PL/SQL определит, насколько корректно они применяются? Если одни модули вызывают другие, может возникнуть ситуация, когда невозможно объявить все модули до первой ссылки на них. Например, что делать, если программа А вызывает программу Б, а программа Б, в свою очередь, — программу А? К счастью, PL/SQL поддерживает рекурсию, в том числе и взаимную, при которой две и более программ явно либо неявно вызывают друг друга.

Хорошая новость для программистов, использующих взаимную рекурсию: PL/SQL позволяет выполнять опережающее объявление локальных модулей, то есть объявлять модули до их фактической реализации. Это дает возможность вызывать модуль из других программ до его определения. Опережающее объявление состоит из заголовка программы, за которым следует точка с запятой. Эта конструкция называется заголовком модуля. Такой заголовок включает список параметров (и секцию RETURN — для функций) и предоставляет всю информацию, которая необходима PL/SQL для объявления модуля и правильной обработки любых обращений к нему.

В следующем примере внутри процедуры определяются две взаимно рекурсивные функции.

Следовательно, заголовок второй функции total_cost должен определяться до объявления функции net_profit:

PROCEDURE perform_calcs (year_in IN INTEGER)
IS
   /* Только заголовок для функции total_cost. */
   FUNCTION total_cost (...) RETURN NUMBER;

   /* Функция net_profit использует total_cost. */
   FUNCTION net_profit (...) RETURN NUMBER IS 
   BEGIN
      RETURN total_sales (...) - total_cost (...);
   END;

   /* Функция total_cost использует net_profit. */
   FUNCTION total_cost (...) RETURN NUMBER IS 
   BEGIN
      IF <условие, основанное на параметрах>
      THEN
         RETURN net_profit (...) * .10;
      ELSE
         RETURN <значение параметра>;
      END IF;
   END;

BEGIN
END;

При использовании опережающих объявлений следует помнить некоторые правила:

  •  Программа не может содержать опережающие объявления переменных или курсо­ров. Этот прием работает только с модулями (процедурами или функциями).
  •  Определение программы должно содержаться в разделе объявлений того же блока PL/SQL (анонимного блока, процедуры, функции или тела пакета), в котором раз­мещается опережающее объявление.

В одних случаях без опережающих объявлений не обойтись; в других они просто делают код более понятным и доступным. Опережающие объявления, как и все расширенные и нестандартные возможности PL/SQL, должны использоваться только тогда, когда они действительно необходимы.

Вас заинтересует / Intresting for you:

Встроенные методы коллекций PL...
Встроенные методы коллекций PL... 14838 просмотров sepia Tue, 29 Oct 2019, 09:54:01
Управление приложениями PL/SQL...
Управление приложениями PL/SQL... 4651 просмотров Stas Belkov Thu, 16 Jul 2020, 06:20:48
Символьные функции и аргументы...
Символьные функции и аргументы... 18586 просмотров Анатолий Wed, 23 May 2018, 18:54:01
Тип данных RAW в PL/SQL
Тип данных RAW в PL/SQL 12331 просмотров Doctor Thu, 12 Jul 2018, 08:41:33
Войдите чтобы комментировать