postgresql
Programmazione con PL / pgSQL
Ricerca…
Osservazioni
PL / pgSQL è il linguaggio di programmazione incorporato di PostgreSQL per la scrittura di funzioni eseguite all'interno del database stesso, note come stored procedure in altri database. Estende SQL con loop, condizionali e tipi di ritorno. Anche se la sua sintassi può sembrare strana per molti sviluppatori, è molto più veloce di qualsiasi altra esecuzione sul server delle applicazioni, poiché l'overhead della connessione al database viene eliminato, il che è particolarmente utile quando altrimenti bisognerebbe eseguire una query, attendere il risultato, e invia un'altra query.
Sebbene esistano molti altri linguaggi procedurali per PostgreSQL, come PL / Python, PL / Perl e PLV8, PL / pgSQL è un punto di partenza comune per gli sviluppatori che desiderano scrivere la loro prima funzione PostgreSQL perché la sua sintassi si basa su SQL. È anche simile a PL / SQL, linguaggio procedurale nativo di Oracle, quindi qualsiasi sviluppatore che abbia familiarità con PL / SQL troverà familiare la lingua, e qualsiasi sviluppatore che intenda sviluppare applicazioni Oracle in futuro ma che vuole iniziare con un database gratuito può effettuare la transizione da PL / pgSQL a PL / SQL con relativa facilità.
Va sottolineato che esistono altri linguaggi procedurali e PL / pgSQL non è necessariamente superiore a loro in alcun modo, inclusa la velocità, ma gli esempi in PL / pgSQL possono fungere da punto di riferimento comune per altri linguaggi utilizzati per scrivere le funzioni di PostgreSQL. PL / pgSQL ha il maggior numero di tutorial e libri di tutti i PL e può essere un trampolino di lancio per imparare le lingue con meno documentazione.
Ecco i link ad alcune guide gratuite e libri su PL / pgSQL:
- La documentazione ufficiale: https://www.postgresql.org/docs/current/static/plpgsql.html
- Esercitazione su w3resource.com: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- tutorial 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
- Guida per gli sviluppatori di PostgreSQL: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Funzione PL / pgSQL di base
Una semplice funzione 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;
Questo potrebbe essere stato ottenuto solo con l'istruzione SQL ma dimostra la struttura di base di una funzione.
Per eseguire la funzione fai:
select active_subscribers();
Sintassi 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
Opzioni per il ritorno in una funzione PL / pgSQL:
-
Datatype
Elenco di tutti i tipi di dati -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
eccezioni personalizzate
creando un'eccezione personalizzata '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
;
creazione di un'eccezione personalizzata che non assegna errm:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
chiamata:
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
qui viene elaborato P0001 personalizzato e P2222 no, interrompendo l'esecuzione.
Inoltre ha molto senso tenere una tabella di eccezioni, come qui: http://stackoverflow.com/a/2700312/5315974