Sie sind auf Seite 1von 26

POSTGRES

Programación de Funciones en PL/pgSQL

Jose Luis Yacelly Ramos


(LENGUAJE PROCEDURAL DE
POSTGRESQL)
• Este lenguaje es usado para crear funciones, procedimientos y
disparadores (triggers).

• PL/pgSQL permite trabajar con estructuras de control y


bucles dentro de las funciones.

• Permite realizar cálculos, manejo de cadenas y consultas


dentro del servidor de la base de datos, combinando el
poder de un lenguaje procedimental y la facilidad de uso de
SQL.
PL/PGSQL: ESTRUCTURA DE LAS
FUNCIONES
• PL/pgSQL presenta una estructura en "Bloques".
• No se pueden definir transacciones dentro de una función
• Cada bloque se define usando
PL/PGSQL ESTRUCTURA

Una función puede constar de varios bloques y estos pueden estar anidados
SINTAXIS EN PL/PGSQL
Comentarios

-- para comentarios de una linea se usa (--)

/* comentarios de varias lineas

se usa (/*……*/) */

Variables

Deben declararse en la sección de declaraciones y pueden ser de cualquier


tipo de datos de SQL.

nombre_variable TIPO_DATO;

Ejm: codigo_usuario INTEGER;


SINTAXIS EN PL/PGSQL
Constantes

Deben declararse en la sección de declaraciones, después del nombre viene la palabra


reservada CONSTANT y su valor no puede ser modificado.

nombre_contante CONSTANT TIPO:= valor;

Ejemplo:

aux CONTANT INTEGER := 10;


PL/PGSQL: GENERALIDADES

• El cuerpo de la función se pasa a la base de datos como una cadena


de caracteres (nótese, que el cuerpo empieza y acaba con comillas
simples) (escape doble)
• Tras la cadena el lenguaje usado para crear la función se define
usando la orden "LANGUAJE" (otros lenguajes posibles son PL/PERL,
PL/TCL, C, etc)
EJEMPLO TRIVIAL QUE NO DEVUELVE RESULTADO

¿Qué hace esta función?

create or replace function cargardatos() returns void


as
'
insert into empresa (nombre_emp,
direccion_emp,telefono_emp) values (''pepsi'',''Av
america'',''23423'');
' language 'sql';
EJEMPLO TRIVIAL SIN PASAR PARÁMETROS
¿Qué hace esta función?

CREATE OR REPLACE FUNCTION mi_funcion()


RETURNS int4 AS
'declare
un_integer int4;
BEGIN

un_integer:= 10 * 10;
RETURN un_integer;
END;
'LANGUAGE 'plpgsql';
TIPOS DE VARIABLES
Ejemplos de variables:

id_usuario INTEGER;
cantidad NUMERIC(5,2);
url VARCHAR;

Todos los tipos de variable definidos para SQL son válidos en PL/pgSQL
EJEMPLO TRIVIAL PASANDO VARIABLES
Calculamos el tamaño de un a cadena

CREATE OR REPLACE FUNCTION size_string (text)


RETURNS int AS
' DECLARE
texto ALIAS FOR $1; --primer parametro
resultado text;
BEGIN
resultado := (select length(texto));
RETURN resultado;
END;
' LANGUAGE 'plpgsql';
MÁS SOBRE VARIABLES
CREATE FUNCTION mifuncion(INTEGER, CHAR, ...)

Se pueden pasar hasta 16 variables

$1, $2, ..., $16

ALIAS permite el renombrado de variables


PL/PGSQL: ESTRUCTURAS DE CONTROL
Condicionales:

IF condiciones THEN
instrucciones;
END IF;

IF condiciones THEN
sentencias;
ELSE
sentencias;
END IF;

IF condiciones THEN
sentencias;
ELSE IF condiciones THEN
sentencias;
END IF;
EJEMPLO IF/ELSE
Programa que calcula la longitud de dos cadenas y devuelve la
longitud mayor.
CREATE OR REPLACE FUNCTION cadena_mas_larga(text, text) RETURNS int4 AS ‘
DECLARE
in_uno ALIAS FOR $1;
in_dos ALIAS FOR $2;
lon_uno int4;
lon_dos int4;
result int4;
BEGIN
lon_uno := (SELECT LENGTH(in_uno));
lon_dos := (SELECT LENGTH(in_dos));
IF lon_uno > lon_dos THEN RETURN lon_uno;
ELSE RETURN lon_dos;
END IF;
END;
'LANGUAGE 'plpgsql';
PL/PGSQL: ESTRUCTURAS DE CONTROL
Repetitivas:
WHILE condicion LOOP

instrucciones;

END LOOP;

FOR int IN [ REVERSE ] desde..hasta LOOP

Instrucciones;

END LOOP;

Referencia: http://www.postgresql.org/docs/9.1/static/plpgsql-control-structures.html
PL/PGSQL: MANEJO DE MENSAJES
Sintaxis:

RAISE nivel-mensaje 'mensaje';

3 niveles existentes:

debug = Es registrado en los logs del servidor y la transacción u operación no


es afectado,

notice = Es registrado en los logs del servidor y también enviado al cliente,


solo es un mensaje de notificación, no es considerado un problema

exception = Es registrado en los logs del servidor y la transacción es


abortado o interrumpido
EXCEPCIONES: EJEMPLO
Calcular la resta de dos numeros enteros

CREATE OR REPLACE FUNCTION resta(int4, int4) RETURNS int4 AS '


DECLARE
inicio ALIAS FOR $1; fin ALIAS FOR $2;
resultado int;
BEGIN
IF (inicio <1) THEN
RAISE EXCEPTION ''El primer numero debe ser mayor que 1'';
ELSE
IF(fin <= inicio) THEN
resultado := inicio-fin;
ELSE
RAISE EXCEPTION ''El primer valor % debe ser mayor que el
ultimo valor %'', inicio, fin;
END IF;
END IF;
RETURN resultado;
END
' LANGUAGE 'plpgsql';
SELECT resta(1,3);
SELECT Y BUCLES
Cuantas empresas empiezan con una letra determinada

CREATE OR REPLACE FUNCTION cuenta_letra (text) RETURNS int4 AS


'
DECLARE
caracter ALIAS FOR $1;
temporal record;
tmp_caracter text; resultado int4;
BEGIN
resultado:=0;
FOR temporal IN SELECT nombre_emp FROM empresa LOOP
tmp_caracter :=substr(temporal.nombre_emp,1,1);
IF tmp_caracter = caracter THEN
resultado := resultado +1;
END IF;
END LOOP;
RETURN resultado;
END;
'LANGUAGE 'plpgsql';
SELECT cuenta_letra('p');
TRIGGERS

Un disparador no es otra cosa que una acción


definida en una tabla de nuestra base de datos
y ejecutada automáticamente por una función
programada por nosotros. Esta acción se
activará, segun la definamos, cuando realicemos
un INSERT, un UPDATE ó un DELETE en la
susodicha tabla.
UN DISPARADOR SE PUEDE DEFINIR DE
LAS SIGUIENTES MANERAS:
Para que ocurra ANTES de cualquier INSERT,UPDATE ó
DELETE

Para que ocurra DESPUES de cualquier INSERT,UPDATE ó


DELETE

Para que se ejecute una sola vez por comando SQL


(statement-level trigger)

Para que se ejecute por cada linea afectada por un comando


SQL (row-level trigger)
ESTRUCTURA DEL TRIGER

CREATE TRIGGER nombre { BEFORE | AFTER }


{ INSERT | UPDATE | DELETE [ OR ... ] } ON
tabla [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE nombre de funcion
( argumentos )
REQUISITOS PARA CREAR UNA FUNCIÓN
TRIGGER.

1. La función trigger no debe recibir ningún


parámetro

2. El tipo de retorno de la función Trigger debe


ser de tipo trigger y no un tipo de dato
VARIABLES ESPECIALES EN PL/PGSQL

NEW -> Variable que contiene la nueva fila de la


tabla para las operaciones INSERT/UPDATE.

OLD -> Variable que contiene la antigua fila de la


tabla para las operaciones UPDATE/DELETE.

referencia: http://www.postgresql.org.es/node/301
DESCRIPCIÓN DEL EJEMPLO
CREATE TABLE alumno_respaldo ( ci integer, nombre text, sexo char, telef varchar(10), colegio text, fecha date);

CREATE OR REPLACE FUNCTION archivar()

RETURNS trigger AS ‘

BEGIN INSERT INTO alumno_respaldo VALUES(

OLD.CI,

OLD.nombre,

OLD.sexo,

OLD.telef,

OLD.colegio,

now());

RETURN NULL;

END; ‘

LANGUAGE ‘plpgsql';
TRIGGER EJEMPLO

CREATE TRIGGER trigger_respaldo


AFTER DELETE ON alumno FOR EACH
ROW EXECUTE PROCEDURE archivar();
funcion(‘hola’ , ’o’) o—>1 h—>1

Das könnte Ihnen auch gefallen