miércoles, febrero 27, 2008

Procedimientos almacenados en PosgreSQL

Bueno aqui dejo un ejemplo de un procedimiento almacenado que realiza un select, y que retorna las filas (los datos) que cumplen con la condicion especificada:


--------------------SPSELECCIONARLECTORNOMBRE--------------------------
create or replace function selectLectorNombre(in nombre varchar,
OUT cod_usuario int, OUT usuario_nombre varchar, OUT usuario_apellido varchar,
OUT usuariorut varchar, OUT usuario_direccion varchar , OUT usuario_telefono varchar, OUT usuario_contrasena varchar,
OUT usuario_tipo int, OUT bloqueado boolean, OUT lector_codabar int)
returns SETOF RECORD AS $sl$
declare
q text;
l record;
begin

q := 'select cod_usuario, usuario_nombre, usuario_apellido, usuario_rut, usuario_direccion,
usuario_telefono, usuario_contrasena, usuario_tipo, bloqueado, lector_codabar from lector where usuario_nombre = ' || quote_literal(nombre)||
' OR usuario_apellido = '|| quote_literal(nombre) ;

for l in execute q loop
cod_usuario := l.cod_usuario;
usuario_nombre := l.usuario_nombre;
usuario_apellido := l.usuario_apellido;
usuariorut := l.usuario_rut;
usuario_direccion := l.usuario_direccion;
usuario_telefono := l.usuario_telefono;
usuario_contrasena := l.usuario_contrasena;
usuario_tipo := l.usuario_tipo;
bloqueado := l.bloqueado;
lector_codabar := l.lector_codabar;
RETURN NEXT;
END LOOP;

RETURN;
END; $sl$ LANGUAGE plpgsql;




--Para ejecutarlo:
select * from selectLectorNombre ('pedro');

jueves, febrero 21, 2008

Regalo gatitos

Bueno recuerdan los gatitos que acogi en mi casa??? ya tan graaandes y los regalo :P saben usar su cajita de arena y comen comida solida, aqui dejo las jotitos :P
son 2 machos de color gris
minino 076
tobi  089
y una hembra
manchitas 078

bueno si alguien quiere uno ...comuniquense conmigo!

jueves, febrero 07, 2008

Triggers en PosgreSQL ( pl/ pgSQL)

Bueno ya estoy trabajando en la Base de datos de mi proyecto, y lo primero que me toco hacer en esta oportunidad fueron triggers utilizando el lengiaje plpgSQL de PosgreSQL( solo habia hecho procedimientos almacenados en SQL server con el lenguajeTransact-SQL)

dejare unos ejemplos a continuacion que seran de utilidad.

ejemplo base:

este trigger basicamente realiza una insercion en una tabla ANTES de insertar en la que se pretende realizar una insersion, o sea al tratar de insertar en la tabla LIBRO se inserta en la tabla MATERIAL .
CREATE OR REPLACE FUNCTION insertlibro() RETURNS trigger AS $insertlibro$

BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO material (cod_tipo_prestamo, material_titulo, material__contenido)
VALUES (new.cod_tipo_prestamo, new.material_titulo, new.material__contenido);
NEW.cod_material := currval('material_cod_material_seq');-- esto va solo si el PK de su tabla es un serial
RETURN NEW;
ELSIF (TG_OP ='UPDATE') THEN
UPDATE material SET cod_tipo_prestao = new.cod_tipo_prestamo, material_titulo = new.material_titulo,material__contenido = new.material__contenido
WHERE cod_material = new.cod_material;
RAISE NOTICE 'NUEVO NOMBRE: %', NEW.USUARIO_NOMBRE;
RETURN NEW;
END IF;

END;
$insertlibro$ LANGUAGE 'plpgsql';

CREATE TRIGGER insertarLibro BEFORE INSERT OR UPDATE ON libro
FOR EACH ROW EXECUTE PROCEDURE insertlibro ();

ejemplo con loop:
este trigger basicamente realiza una insercion multiple en una tabla DESPUES de insertar en la tabla LIBRO .Se insertan varios ejemplares de libro en la tabla EJEMPLARES.

CREATE OR REPLACE FUNCTION insertarEjemplar ()RETURNS TRIGGER AS $W$
DECLARE
cont int := 0;
BEGIN
LOOP
/* inicia loop*/
cont := cont + 1;

INSERT INTO ejemplar(cod_material, ejemplar_estado, ejemplar_numero_identificador)
VALUES (new.cod_material,FALSE,cont);


IF cont = NEW.libro_numero_ejemplares THEN
EXIT;/* finaliza loop solo si se cumple la condicion*/
END IF;

END LOOP;
RETURN NEW;
END;
$W$ LANGUAGE 'plpgsql';

CREATE TRIGGER insertarEjemplares AFTER INSERT ON libro
FOR EACH ROW EXECUTE PROCEDURE insertarEjemplar();

dejare la foto del modelo fisico de datos sobre el cual se estan trabajando estos triggers para su mejor comprension:

modeloFISICO