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:

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:

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



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow