PostgreSQL - Функции

{title}

Как и в большинстве баз данных, мы можем связать последовательность операторов SQL и рассматривать их как единицу функционального блока; Различные базы данных описывают эту операцию с разными именами, хранимыми процедурами, модулями, макросами и т. Д.

В PostgreSQL они называются функциями. Помимо объединения нескольких операторов SQL, эти функции также дают нам возможность выполнять операторы SQL с использованием процедурных языков (PL).

В PostgreSQL у нас есть несколько вариантов для этого и возможность их расширения.

1. Функции PostgreSQL


Анатомия функции
Независимо от языка, используемого для написания функций, они имеют структуру, эту структуру можно синтезировать следующим образом:
 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ func_name (arg1_arg1datatype) ВОЗВРАЩАЕТ some_type / setoff sometype / TABLE / (..) / AS $$ BODY off function $$ LANGUAGE language_of_function 
Если мы опишем то, что видим, довольно просто, CREATE OR REPLACE FUNCTION - это условие создания функции, func_name - это имя, в котором arg1 - это параметр, который он получит, а arg1_datatype - это тип данных, который является указанным параметром, то есть, если это целое число строка и т. д. В RETURNS мы возвращаем результат нашей функции, $$ является началом блока, который уступает основанию функции, а затем заканчивается тем же с помощью $$, и, наконец, LANGUAGE позволяет нам указать язык, на котором написана функция.

Это четко определенная и вполне читаемая структура, поэтому у нас не должно возникнуть проблем при создании наших функций.

Написание функций с SQL
Написание функций с использованием SQL довольно просто и быстро, в основном это наши операторы SQL и добавление верхнего и нижнего колонтитула функций, и мы готовы.

Однако, как и все остальное, это происходит за счет некоторых жертв, например, мы теряем гибкость, которую нам удается работать с другим языком для создания более условных ветвей управления выполнением, мы не можем иметь более одного оператора SQL, хотя это можно исправить, используя Различные методы

Самое большое преимущество состоит в том, что, будучи SQL, планировщик PostgreSQL позволяет нам использовать индексы и тем самым ускорить их выполнение, вместо этого с другими языками функция всегда будет черным ящиком.

Теперь давайте посмотрим на функцию, написанную на SQL:

 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ ins_logs (param_user_name varchar, param_description text) ВОЗВРАЩАЕТСЯ целым числом AS $$ INSERT INTO logs (user_name, description) VALUES ($ 1, $ 2) RETURNING log_id; $$ LANGUAGE 'sql' VOLATILE; 
Мы видим, что мы следуем структуре, определенной выше, и в конце в разделе ЯЗЫК мы определяем 'sql' предложение VOLATILE, которое у него есть, что означает, что функция может возвращать что-то свое при каждом вызове, даже если она получает те же параметры. Затем для вызова нашей функции мы можем использовать:
 SELECT ins_logs ('lhsu', 'это тест') As new_id; 
Мы выполняем оператор SELECT, функция активна, и она возвращает то, что мы получим, и мы увидим в этом случае значение, которое мы вызываем new_id и которое функция возвращает как log_id.
Мы даже можем использовать функцию для обновления реестра и возврата параметра void, как в этом примере:
 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ upd_logs (log_id integer, param_user_name varchar, param_description text) ВОЗВРАЩАЕТСЯ void AS $$ ОБНОВЛЕНИЕ журналов SET user_name = $ 2, описание = $ 3, log_ts = CURRENT_TIMESTAMPWHERE log_id = $ 1; $ 'LANGU 
Так как void, нам не нужно поле получения, поэтому мы выполняем его следующим образом:
 ВЫБЕРИТЕ upd_logs (12, 'robe', 'Change to regina'); 
Здесь мы видим, что мы исключаем последний шаг As new_id из предыдущего вызова.
На этом мы заканчиваем это руководство и уже можем выполнять наши основные функции в SQL, упрощая и упрощая многие действия, которые могут нам понадобиться в программе или системе, которую мы создаем.

2. Функции PostgreSQL на других языках


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

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

Давайте рассмотрим пример функции, написанной на этом языке:

 CREATE FUNCTION sel_logs_rt (param_user_name varchar) ВОЗВРАЩАЕТСЯ ТАБЛИЦА (log_id int, user_name varchar (50), текст описания, log_ts timestamptz) AS $$ BEGIN RETURN QUERY SELECT log_id, имя_пользователя, описание, log_ts FROM_символ_ГД__ пользователя END; $$ LANGUAGE 'plpgsql' STABLE; 
Теперь давайте посмотрим, как писать функции с помощью Python.

Написание функций с Python
Python - довольно чистый язык программирования, который имеет большое количество доступных библиотек.
PostgreSQL является единственным механизмом базы данных, который позволяет использовать Python для построения функций.

Чтобы получить возможность создания функций с помощью Python, мы должны сначала убедиться, что у нас установлен язык на нашем сервере. Как только мы узнаем, что оно установлено, мы должны включить расширения в PostgreSQL, используя следующие команды:

 СОЗДАТЬ РАСШИРЕНИЕ plpython2u; СОЗДАТЬ РАСШИРЕНИЕ plpython3u; 
Мы должны убедиться, что Python запущен и работает, прежде чем включать расширения, чтобы избежать ошибок.

$config[ads_text5] not found

Основные функции с Python
Как только мы активируем все, чтобы иметь возможность использовать Python, мы начнем создавать нашу функцию, важно знать, что PostgreSQL может преобразовывать свои типы данных в типы данных Python и наоборот. PL / Python даже способен возвращать массивы и составные типы.

Давайте посмотрим ниже на функцию, которая выполняет текстовый поиск в онлайн-ресурсе, чего нельзя сделать с помощью PL / pgSQL, на следующем рисунке мы увидим код и затем сделаем соответствующее объяснение.

  • Мы импортируем библиотеки, которые собираемся использовать.
  • Мы делаем поиск в Интернете, объединяя пользовательские параметры ввода.
  • Мы читаем ответ и сохраняем его в файле HTML с именем raw_html.
  • Мы сохраняем ту часть HTML, которая начинается и заканчивается до начала.
  • Мы удаляем HTML-теги и пробелы и возвращаемся, чтобы сохранить переменную с именем result.
  • Мы возвращаем окончательный результат.
  • Еще одна интересная функциональность использования Python - это то, что мы можем напрямую взаимодействовать с операционной системой, давайте посмотрим на функцию, которая создает список каталогов, следует отметить, что это должно быть создано суперпользователем:
 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ list_incoming_files () ВОЗВРАЩАЕТ SETOF text AS $$ os return os.listdir ('/coming') $$ LANGUAGE 'plpython2u' ОПРЕДЕЛИТЕЛЬ ВОЛАТНОЙ БЕЗОПАСНОСТИ; 
В чем полезность этого? Мы можем спросить себя, потому что мы представляем, что хотим просмотреть файлы, которые есть в системе, вызов функции будет выглядеть примерно так:
 ВЫБЕРИТЕ имя файла ИЗ list_incoming_files () Как имя файла ГДЕ имя файла ILIKE '% .csv' 
На этом мы заканчиваем этот урок, мы уже управляем созданием функций на других языках в PostgreSQL, что дает нам бесконечное поле для требований.