postgresql
Программирование с помощью PL / pgSQL
Поиск…
замечания
PL / pgSQL - это встроенный язык программирования PostgreSQL для написания функций, которые выполняются в самой базе данных, известной как хранимые процедуры в других базах данных. Он расширяет SQL с помощью циклов, условных выражений и возвращаемых типов. Хотя его синтаксис может быть странным для многих разработчиков, он намного быстрее, чем все, что работает на сервере приложений, потому что устранены накладные расходы на подключение к базе данных, что особенно полезно, когда вам в противном случае нужно было бы выполнить запрос, дождаться результата, и отправить другой запрос.
Хотя для PostgreSQL существует много других процедурных языков, таких как PL / Python, PL / Perl и PLV8, PL / pgSQL является общей отправной точкой для разработчиков, которые хотят написать свою первую функцию PostgreSQL, потому что ее синтаксис построен на SQL. Он также похож на PL / SQL, собственный процедурный язык Oracle, поэтому любой разработчик, знакомый с PL / SQL, найдет язык знакомым, и любой разработчик, который намеревается разрабатывать приложения Oracle в будущем, но хочет начать с бесплатной базы данных, может перейти от PL / pgSQL до PL / SQL с относительной легкостью.
Следует подчеркнуть, что существуют другие процедурные языки, и PL / pgSQL не обязательно превосходит их в любом случае, включая скорость, но примеры в PL / pgSQL могут служить общей точкой отсчета для других языков, используемых для написания функций PostgreSQL. PL / pgSQL имеет большинство учебников и книг всех PL и может стать плацдармом для изучения языков с меньшей документацией.
Вот ссылки на некоторые бесплатные руководства и книги по PL / pgSQL:
- Официальная документация: https://www.postgresql.org/docs/current/static/plpgsql.html
- w3resource.com учебник: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- postgres.cz учебник: http://postgres.cz/wiki/PL/pgSQL_(en)
- PostgreSQL Server Programming, 2nd Edition: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-second-edition
- Руководство для разработчиков PostgreSQL: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Основная функция PL / pgSQL
Простая функция PL / pgSQL:
CREATE FUNCTION active_subscribers() RETURNS bigint AS $$
DECLARE
-- variable for the following BEGIN ... END block
subscribers integer;
BEGIN
-- SELECT must always be used with INTO
SELECT COUNT(user_id) INTO subscribers FROM users WHERE subscribed;
-- function result
RETURN subscribers;
EXCEPTION
-- return NULL if table "users" does not exist
WHEN undefined_table
THEN RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Это могло быть достигнуто только с помощью инструкции SQL, но демонстрирует основную структуру функции.
Для выполнения функции выполните:
select active_subscribers();
Синтаксис PL / pgSQL
CREATE [OR REPLACE] FUNCTION functionName (someParameter 'parameterType')
RETURNS 'DATATYPE'
AS $_block_name_$
DECLARE
--declare something
BEGIN
--do something
--return something
END;
$_block_name_$
LANGUAGE plpgsql;
RETURNS Block
Параметры для возврата в PL / pgSQL:
-
Datatype
Список всех типов данных -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
пользовательские исключения
создание настраиваемого исключения «P2222»:
create or replace function s164() returns void as
$$
begin
raise exception using message = 'S 164', detail = 'D 164', hint = 'H 164', errcode = 'P2222';
end;
$$ language plpgsql
;
создание настраиваемого исключения, не присваивающего errm:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
призвание:
t=# do
$$
declare
_t text;
begin
perform s165();
exception when SQLSTATE 'P0001' then raise info '%','state P0001 caught: '||SQLERRM;
perform s164();
end;
$$
;
INFO: state P0001 caught: nothing specified
ERROR: S 164
DETAIL: D 164
HINT: H 164
CONTEXT: SQL statement "SELECT s164()"
PL/pgSQL function inline_code_block line 7 at PERFORM
здесь пользовательский P0001 обрабатывается, а P2222, а не, прерывает выполнение.
Также имеет смысл хранить таблицу исключений, например здесь: http://stackoverflow.com/a/2700312/5315974