DETERMINISTIC: детерминированные функции в PL/SQL на примере

DETERMINISTIC в PL/SQLФункция называется детерминированной, если при одном наборе параметров IN и IN OUT она всегда возвращает одно и то же значение. Отличительной чертой детерминированных функций является отсутствие побочных эффектов: все изменения, вносимые программой, отражаются в списке параметров.

Пример детерминированной функции, которая представляет собой простую инкапсу­ляцию substr:

 

 

 

FUNCTION betwnstr (
   string_in IN VARCHAR2, start_in IN PLS_INTEGER, end_in IN PLS_INTEGER)
   RETURN VARCHAR2 IS 
BEGIN
   RETURN (SUBSTR (string_in, start_in, end_in - start_in + 1));
END betwnstr;

Если при вызове функции передаются, например, строка «abcdef» (string_in), число 3 (start_in) и 5 (end_in), то сколько бы раз вы ни вызывали функцию betwnStr с этим на­бором параметров, она всегда будет возвращать строку «cde». Тогда почему бы Oracle не сохранить результат, связанный с конкретным набором аргументов? Ведь при следующем вызове функции с теми же параметрами можно получить результат, не выполняя код функции! Чтобы добиться подобного эффекта, включите предложение DETERMINISTIC в заголовок функции:

FUNCTION betwnstr (
   string_in IN VARCHAR2, start_in IN PLS_INTEGER, end_in IN PLS_INTEGER)
   RETURN VARCHAR2 DETERMINISTIC

Решение об использовании сохраненной копии возвращаемого результата (если такая копия доступна) принимается оптимизатором запросов Oracle. Сохраненные копии могут браться из материализованного представления, функционального индекса или повторного вызова одной функции в команде SQL.

Функция должна быть объявлена с ключевым словом DETERMINISTIC, чтобы она могла вызываться в выражении функционального индекса или из запроса материализованного представления с пометкой REFRESH FAST или ENABLE QUERY REWRITE. Кроме того, кэширование входных данных и результатов детерминированной функции выполняется только тогда, когда функция вызыва­ется в команде SQL.

Детерминированная функция может улучшить производительность команд SQL, вы­зывающих такие функции. В Oracle нет надежного способа проверки отсутствия побочных эффектов у функций, объявленных детерминированными. Поэтому при использовании таких функций вся ответственность за последствия возлагается на программиста. Детерминированная функция не должна основываться на переменных пакета и иметь право изменять ре­зультирующие значения в базе данных.

Эффект от использования детерминированных функций (и их ограничения) продемон­стрирован в файле deterministic.sql.

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

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

Войдите чтобы комментировать

Xima84 аватар
Xima84 ответил в теме #9404 03 апр 2019 08:29
ссылка на файл не работает
apv аватар
apv ответил в теме #9293 22 нояб 2018 05:57
Хорошее описание DETERMINISTIC. Коротко и по делу все.