postgresql
Programowanie w PL / pgSQL
Szukaj…
Uwagi
PL / pgSQL to wbudowany język programowania PostgreSQL do pisania funkcji działających w samej bazie danych, zwanych procedurami przechowywanymi w innych bazach danych. Rozszerza SQL o pętle, warunki warunkowe i typy zwracane. Chociaż jego składnia może być dziwna dla wielu programistów, jest znacznie szybsza niż cokolwiek działającego na serwerze aplikacji, ponieważ eliminuje się narzut związany z łączeniem się z bazą danych, co jest szczególnie przydatne, gdy w innym przypadku konieczne byłoby wykonanie zapytania, czekanie na wynik, i prześlij kolejne zapytanie.
Chociaż istnieje wiele innych języków proceduralnych dla PostgreSQL, takich jak PL / Python, PL / Perl i PLV8, PL / pgSQL jest częstym punktem wyjścia dla programistów, którzy chcą napisać swoją pierwszą funkcję PostgreSQL, ponieważ jej składnia opiera się na SQL. Jest również podobny do PL / SQL, natywnego języka procedury Oracle, więc każdy programista zaznajomiony z PL / SQL znał ten język, a każdy programista, który zamierza opracować aplikacje Oracle w przyszłości, ale chce zacząć od darmowej bazy danych, może przejść z PL / pgSQL na PL / SQL ze względną łatwością.
Należy podkreślić, że istnieją inne języki proceduralne i PL / pgSQL niekoniecznie przewyższa je w jakikolwiek sposób, w tym szybkość, ale przykłady w PL / pgSQL mogą służyć jako wspólny punkt odniesienia dla innych języków używanych do pisania funkcji PostgreSQL. PL / pgSQL zawiera najwięcej samouczków i książek ze wszystkich PL i może być odskocznią do nauki języków z mniejszą ilością dokumentacji.
Oto linki do niektórych bezpłatnych przewodników i książek na temat PL / pgSQL:
- Oficjalna dokumentacja: https://www.postgresql.org/docs/current/static/plpgsql.html
- samouczek w3resource.com: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- samouczek postgres.cz: http://postgres.cz/wiki/PL/pgSQL_(en)
- Programowanie serwera PostgreSQL, wydanie drugie: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-second-edition
- Podręcznik dewelopera PostgreSQL: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Podstawowa funkcja PL / pgSQL
Prosta funkcja 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;
Można to osiągnąć za pomocą samej instrukcji SQL, ale pokazuje ona podstawową strukturę funkcji.
Aby wykonać funkcję:
select active_subscribers();
Składnia 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;
ZWRACA Blok
Opcje zwracania w funkcji PL / pgSQL:
-
Datatype
Lista wszystkich typów danych -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
niestandardowe wyjątki
tworzenie niestandardowego wyjątku „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
;
tworzenie niestandardowego wyjątku bez przypisywania errm:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
powołanie:
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
tutaj niestandardowe P0001 przetworzone, a P2222, nie, przerywanie wykonania.
Bardzo sensowne jest także utrzymywanie tabeli wyjątków, na przykład tutaj: http://stackoverflow.com/a/2700312/5315974