PostgreSQL - Функции

Както в повечето бази данни, можем да веригираме поредица от изречения SQL и да ги третира като единица от функционален блок; различните бази данни описват тази операция с различни имена, съхранени процедури, модули, макроси и т.н.

В PostgreSQL те се наричат ​​функции. Освен че обединяват няколко SQL израза, тези функции ни дават и възможност да изпълняваме SQL изрази, използвайки процедурни езици (PL).

В PostgreSQL имаме множество възможности за това и възможността да ги разширим.

1. PostgreSQL функции


Анатомия на функция
Независимо от езика, използван за писане на функциите, те имат структура, тази структура може да бъде синтезирана със следното:
 CREATE OR REPLACE FUNCTION func_name (arg1_arg1datatype) ВРЪЩАНЕ some_type / setoff sometype / TABLE / (…) / AS $$ BODY off функция $$ LANGUAGE language_of_function
Ако опишем това, което виждаме, е съвсем просто, СЪЗДАЙТЕ ИЛИ ЗАМЕНЕТЕ ФУНКЦИЯ е клаузата за създаване на функция, func_name е името, което arg1 ще има, е параметърът, който ще получи, а arg1_datatype е типът данни, който е споменатият параметър, тоест ако е цяло число, низ и т.н. В СЕ ЗАВРЪЩА Връщаме резултата от нашата функция, $$ е началото на блока, който ще отстъпи на тялото на функцията и след това завършва същото с $$ и накрая ЕЗИК ни позволява да посочим езика, на който е написана функцията.

Това е добре дефинирана и доста четлива структура, така че не би трябвало да имаме проблеми при създаването на нашите функции.

Писане на функции с SQL
Напишете функциите с помощта SQL Това е доста лесно и бързо, това е да вземем нашите SQL изявления основно и да добавим заглавката и долния колонтитул на функциите към него и сме готови.

Както и всичко останало, това идва с цената на някои жертви, например губим гъвкавост, че ако можем да работим с друг език, за да създадем повече клонове на контрола за условно изпълнение, не можем да имаме повече от един SQL израз, въпреки че това може да бъде поправено използвайки различни методи.

Най -голямото предимство е, че тъй като SQL е планировчикът PostgreSQL ни позволява да се възползваме от индексите и по този начин да ускорим изпълнението му, от друга страна с други езици функцията винаги ще бъде черна кутия

Сега нека разгледаме функция, написана с SQL:

 CREATE OR REPLACE FUNCTION ins_logs (param_user_name varchar, param_description text) ВРЪЩА цяло число AS $$ INSERT INTO дневници (user_name, description) VALUES ($ 1, $ 2) RETURNING log_id; $$ ЕЗИК 'sql' VOLATILE;
Виждаме, че следваме структурата, определена по -горе и в края на раздела ЕЗИК дефинираме 'sql' клауза ЛЕТЛИВ Това, което притежава, означава, че функцията може да върне нещо различно при всяко извикване към нея, дори ако получава същите параметри. След това за извикване на нашата функция можем да използваме:
 SELECT ins_logs ('lhsu', 'this is a test') Като new_id;
Ние правим изречение SELECT, функцията е активна и това, което връща, е това, което ще получим и в този случай ще видим стойност, която наричаме new_id и че функцията се връща като log_id.
Можем дори да използваме функция, за да направим актуализация на записа и да върнем параметър void, както в този пример:
 CREATE OR REPLACE FUNCTION upd_logs (log_id integer, param_user_name varchar, param_description text) ВРЪЩА анулация AS $$ UPDATE logs SET user_name = $ 2, description = $ 3, log_ts = CURRENT_TIMESTAMPWHERE log_id = $ 1; ' ЛЕТЛИВ '
Като невалидни не се нуждаем от поле за приемник, затова го изпълняваме, както следва:
 SELECT 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 времева маркировка) AS $$ BEGIN RETURN QUERY SELECT log_id, user_name, description, log_ts FROM_name; КРАЙ; $$ ЕЗИК 'plpgsql' STABLE; 
Сега нека видим как да пишем функции с Python.

Писане на функции с Python
Python е доста чист език за програмиране, който разполага с голям брой библиотеки.
PostgreSQL е единственият механизъм за бази данни, който ви позволява да използвате Python за изграждане на функции.

За да получим възможността за създаване на функции с Python, първо трябва да се уверим, че езикът е инсталиран на нашия сървър. След като знаем, че сме го инсталирали, трябва да активираме разширенията в PostgreSQL, като използваме следните команди:

 СЪЗДАВАНЕ НА РАЗШИРЕНИЕ plpython2u; СЪЗДАВАНЕ НА РАЗШИРЕНИЕ plpython3u; 
Трябва да се уверим, че Python е работещ, преди да разрешим разширенията, за да избегнем грешки.

Основни функции с Python
След като активираме всичко, за да можем да използваме Python, ще започнем да изграждаме нашата функция, важно е да знаете, че PostgreSQL може да преобразува своите типове данни в типове данни на Python и обратно. PL / Python дори може да връща масиви и съставни типове.

Нека видим по -долу функция, която извършва текстово търсене в онлайн ресурс, нещо, което не може да се направи с PL / pgSQL, на следващото изображение ще видим кода и след това ще направим съответното обяснение.

  • Импортираме библиотеките, които ще използваме.
  • Ние правим уеб търсенето, като конкатенираме входните параметри на потребителя.
  • Ние четем отговора и го запазваме в HTML файл, наречен raw_html.
  • Запазваме частта от HTML, която започва с и завършва преди началото на.
  • Премахваме HTML таговете и интервалите и отново запазваме променливата, наречена result.
  • Връщаме крайния резултат.
  • Друга интересна характеристика на използването на Python е, че можем да взаимодействаме директно с операционната система, нека видим функция, която прави списък с директории, трябва да се отбележи, че това трябва да бъде създадено от суперпотребител:
 CREATE OR REPLACE FUNCTION list_incoming_files () ВРЪЩА SETOF текст КАТО $$ import os return os.listdir ('/ incoming') $$ LANGUAGE 'plpython2u' ДЕФИНИРАТОР НА ВОЛАТИЛНА СИГУРНОСТ;
Каква е ползата от това? Можем да се запитаме, защото представете си, че искаме да се консултираме с файловете, които имаме на разположение в системата, извикването на функцията ще бъде нещо подобно:
 SELECT filename FROM list_incoming_files () Като име на файл WHERE име на файл ILIKE '% .csv'
С това приключваме този урок, вече се справяме със създаването на функции на други езици в PostgreSQL, което ни дава безкрайно поле, когато става въпрос за изпълнение на нашите изисквания.

wave wave wave wave wave