postgresql
Programmering med PL / pgSQL
Sök…
Anmärkningar
PL / pgSQL är PostgreSQLs inbyggda programmeringsspråk för skrivfunktioner som körs i själva databasen, känd som lagrade procedurer i andra databaser. Den utökar SQL med slingor, konditioner och returtyper. Även om syntaxen kan vara konstig för många utvecklare är den mycket snabbare än någonting som körs på applikationsservern eftersom anslutningen till databasen elimineras, vilket är särskilt användbart när du annars skulle behöva utföra en fråga, vänta på resultatet, och skicka in en ny fråga.
Även om många andra processuella språk finns för PostgreSQL, som PL / Python, PL / Perl och PLV8, är PL / pgSQL en vanlig utgångspunkt för utvecklare som vill skriva sin första PostgreSQL-funktion eftersom dess syntax bygger på SQL. Det liknar också PL / SQL, Oracle's ursprungliga procedurspråk, så alla utvecklare som är bekanta med PL / SQL kommer att hitta språket som är bekant, och alla utvecklare som avser att utveckla Oracle-applikationer i framtiden men vill börja med en gratis databas kan övergå från PL / pgSQL till PL / SQL med relativt enkelhet.
Det bör betonas att andra processuella språk finns och PL / pgSQL inte nödvändigtvis är överlägsen dem på något sätt, inklusive hastighet, men exempel i PL / pgSQL kan fungera som en gemensam referenspunkt för andra språk som används för att skriva PostgreSQL-funktioner. PL / pgSQL har flest tutorials och böcker för alla PL: er och kan vara en språngbräda för att lära sig språken med mindre dokumentation.
Här är länkar till några gratis guider och böcker om PL / pgSQL:
- Den officiella dokumentationen: https://www.postgresql.org/docs/current/static/plpgsql.html
- w3resource.com handledning: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- postgres.cz handledning: http://postgres.cz/wiki/PL/pgSQL_(en)
- PostgreSQL Server-programmering, 2: a upplagan: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-second-edition
- PostgreSQL utvecklarhandbok: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Grundläggande PL / pgSQL-funktion
En enkel PL / pgSQL-funktion:
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;
Detta kunde ha uppnåtts med bara SQL-uttalandet men visar den grundläggande strukturen för en funktion.
För att utföra funktionen gör du:
select active_subscribers();
PL / pgSQL-syntax
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
Alternativ för att återvända i en PL / pgSQL-funktion:
-
Datatype
Lista över alla datatyper -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
anpassade undantag
skapar anpassat undantag '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
;
skapa anpassat undantag, inte tilldela errm:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
kallelse:
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
här anpassade P0001 och P2222, inte, avbryter exekveringen.
Det är också väldigt vettigt att hålla en tabell med undantag, som här: http://stackoverflow.com/a/2700312/5315974