postgresql
Programación con PL / pgSQL
Buscar..
Observaciones
PL / pgSQL es el lenguaje de programación incorporado de PostgreSQL para escribir funciones que se ejecutan dentro de la base de datos, conocido como procedimientos almacenados en otras bases de datos. Extiende SQL con bucles, condicionales y tipos de retorno. Aunque su sintaxis puede ser extraña para muchos desarrolladores, es mucho más rápida que cualquier cosa que se ejecute en el servidor de aplicaciones porque se elimina la sobrecarga de conexión a la base de datos, lo cual es particularmente útil cuando de lo contrario necesitaría ejecutar una consulta, espere el resultado. y enviar otra consulta.
Aunque existen muchos otros lenguajes de procedimiento para PostgreSQL, como PL / Python, PL / Perl y PLV8, PL / pgSQL es un punto de partida común para los desarrolladores que desean escribir su primera función PostgreSQL porque su sintaxis se basa en SQL. También es similar a PL / SQL, el lenguaje de procedimiento nativo de Oracle, por lo que cualquier desarrollador familiarizado con PL / SQL encontrará el lenguaje familiar, y cualquier desarrollador que pretenda desarrollar aplicaciones de Oracle en el futuro pero que quiera comenzar con una base de datos gratuita puede hacer la transición. desde PL / pgSQL a PL / SQL con relativa facilidad.
Se debe enfatizar que existen otros lenguajes de procedimiento y PL / pgSQL no es necesariamente superior a ellos de ninguna manera, incluida la velocidad, pero los ejemplos en PL / pgSQL pueden servir como un punto de referencia común para otros lenguajes utilizados para escribir funciones de PostgreSQL. PL / pgSQL tiene la mayoría de los tutoriales y libros de todos los PL y puede ser un trampolín para aprender los idiomas con menos documentación.
Aquí hay enlaces a algunas guías y libros gratuitos sobre PL / pgSQL:
- La documentación oficial: https://www.postgresql.org/docs/current/static/plpgsql.html
- Tutorial de w3resource.com: http://www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- postgres.cz tutorial: http://postgres.cz/wiki/PL/pgSQL_(en)
- Programación del servidor PostgreSQL, 2ª edición: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-second-edition
- Guía del desarrollador de PostgreSQL: https://www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
Función PL / pgSQL básica
Una simple función 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;
Esto podría haberse logrado solo con la instrucción SQL, pero demuestra la estructura básica de una función.
Para ejecutar la función haz:
select active_subscribers();
Sintaxis de 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;
Bloque de devoluciones
Opciones para regresar en una función PL / pgSQL:
- Lista de tipos de
Datatype
de todos los tipos de datos -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
excepciones personalizadas
creando la excepción personalizada '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
;
creando una excepción personalizada que no asigna errm:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
vocación:
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
Aquí se procesa el P0001 personalizado y P2222, no, abortando la ejecución.
También tiene mucho sentido mantener una tabla de excepciones, como aquí: http://stackoverflow.com/a/2700312/5315974