Está en la página 1de 7

EJERCICIOS DE FUNCIONES Y DISPARADORES

INTEGRANTES: KERVIN MORA EXP 344990


RICARDO MELCHIONDA EXP 34964
WILMARY LPEZ EXP 28967

Realice los disparadores y/o funciones almacenadas, adems escriba la sentencia


SQL correspondiente para llamar a la funcin, de los siguientes enunciados:

a) Cree un disparador en la tabla servicio que garantice que el precio


del servicio no sea menor a 15 Bs. ni mayor a 130 Bs.

CREATE OR REPLACE FUNCTION tg_precio()


RETURNS TRIGGER AS
$BODY$
DECLARE
precio float;
BEGIN
IF NEW.precio > 15 AND NEW.precio < 130 THEN
RETURN NEW;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER validarprecio


BEFORE INSERT OR UPDATE
ON servicio
FOR EACH ROW
EXECUTE PROCEDURE tg_precio();

Como lo indica el enunciado, este disparador se activaria cuando el


precio sea menor a 15 y mayor a 130.

b) Cree una funcin que devuelva concatenado el nombre y apellido de


un cliente segn su cdigo.

CREATE OR REPLACE FUNCTION nombrecompleto(character varying)


RETURNS character varying AS
$BODY$

BEGIN

RETURN (SELECT (nombre||' '||apellido) AS nombrecomp


FROM cliente WHERE codc = $1);
END;

$BODY$
LANGUAGE plpgsql;

SELECT nombrecompleto('0001');
c) Cree una rutina almacenada que devuelva el total cobrado por los
servicios de un taxi en particular.

CREATE OR REPLACE FUNCTION rutina(character varying)


RETURNS character varying AS
$BODY$

BEGIN

RETURN (SELECT SUM(precio) AS rutina


FROM servicio WHERE "TAXIplaca" = $1);
END;

$BODY$
LANGUAGE plpgsql;
SELECT rutina('0001');

d) Cree un disparador que al ingresar un nuevo taxi, tanto el modelo


como la marca de ste sea escrito en minsculas.

CREATE OR REPLACE FUNCTION triggers_taxi_minuscula() RETURNS TRIGGER AS


$$
BEGIN
new.marca := lower(new.marca);
new.modelo := lower(new.modelo);

RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER triggers_taxi_minuscula BEFORE INSERT OR UPDATE ON taxi


FOR EACH ROW EXECUTE PROCEDURE triggers_taxi_minuscula();

Como lo indica el enunciado, este disparador se activara cuando se


ingresen datos a la marca y modelo de un taxi y verificara que este
escrito en minsculas.

e) Cree un disparador que al asignar la cantidad de viajes a un taxi,


sta no sea menor a 3.

CREATE OR REPLACE FUNCTION tg_asignarcantidad()


RETURNS TRIGGER AS
$BODY$
DECLARE
cantidad float;
BEGIN
IF NEW.cantidad > 3 THEN
RETURN NEW;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER asignarcantidad


BEFORE INSERT OR UPDATE
ON viajes_asignados
FOR EACH ROW
EXECUTE PROCEDURE tg_asignarcantidad();

Como lo indica el enunciado, este disparador se activara cuando la


cantidad de viajes asignados a un taxi sea menor que 3.

f) Desarrolle una funcin almacenada que devuelva el promedio del


precio de los servicios prestado por un taxi determinado.

CREATE OR REPLACE FUNCTION promedio(character varying)


RETURNS character varying AS
$BODY$

BEGIN

RETURN (SELECT TRUNC (AVG(precio)) AS promedio


FROM servicio WHERE "TAXIplaca" = $1);
END;

$BODY$
LANGUAGE plpgsql;

SELECT promedio('0001');

g) Elabore una rutina almacenada que incremente en uno (1) el nmero


de viajes asignados a cada taxi.

CREATE OR REPLACE FUNCTION incrementar1()


RETURNS BOOLEAN AS
$BODY$
BEGIN

UPDATE viajes_asignados SET cantidad=cantidad+1;

RETURN TRUE;
END;
$BODY$
LANGUAGE plpgsql;

SELECT incrementar1();
h) Elabore una funcin almacenada que devuelva los servicios prestados
por un taxi en particular, donde se refleje el nombre de la
terminal y la ciudad de la misma, as como tambin el nombre del
cliente y la ciudad del mismo a quien se le prest el servicio.

CREATE OR REPLACE FUNCTION servicios_prestados_t(


IN character varying,
OUT primerparametro character varying,
OUT segundoparametro character varying,
OUT tercerparametro character varying,
OUT cuartoparametro numeric,
OUT quintoparametro character varying,
OUT sextoparametro character varying,
OUT septimoparametro character varying)
RETURNS SETOF record AS
$BODY$
DECLARE

servicios_p record;

BEGIN

RETURN QUERY SELECT taxi.placa, t.nombre AS terminal_servicio, t.ciudad


AS ciudad_terminal,
s.precio, c.nombre AS cliente_nombre, c.apellido AS cliente_apellido,
c.ciudad AS ciudad_cliente
FROM servicio AS s INNER JOIN cliente AS c ON c.codc=s."CLIENTEcodc"
INNER JOIN terminal AS t ON
s."TERMINALnitp"=t.nitp INNER JOIN taxi ON taxi.placa=s."TAXIplaca" and
taxi.placa=$1;

RETURN;
END;
$BODY$
LANGUAGE plpgsql;
SELECT servicios_prestados_t('0001')

i) Cree una funcin almacenada que devuelva la proporcin de viajes


asignados a un taxi con respecto al total de viajes asignados de todos
los taxis

CREATE OR REPLACE FUNCTION proporcion_viajes(character varying)


RETURNS numeric AS
$BODY$
DECLARE
total_viajes decimal;
total_viajes_taxi decimal;
proporcion decimal;
BEGIN
total_viajes:= (SELECT SUM(cantidad) AS total_viajes FROM
viajes_asignados);
total_viajes_taxi:=( SELECT SUM(cantidad) AS total_viajes_taxi
FROM viajes_asignados
WHERE "TAXIplaca"=$1);

proporcion:=total_viajes_Taxi*100/total_viajes;

RETURN proporcion;
END;
$BODY$
LANGUAGE plpgsql;

SELECT proporcion_viajes('0001');

j) Elabore un disparador que al ingresar un nuevo taxi, se le sea


asignado un viaje desde la terminal La Redoma de San Felipe.

CREATE OR REPLACE FUNCTION triggers_taxi_viaje_asignado() RETURNS


TRIGGER AS $$

BEGIN

INSERT INTO viajes_asignados ("TERMINALnitp","TAXIplaca",cantidad) values


('0003',new.placa,3);

RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER triggers_taxi_viaje_asignado After INSERT ON taxi FOR EACH


ROW EXECUTE PROCEDURE triggers_taxi_viaje_asignado();

Como lo indica el enunciado, este disparador se activara cuando se


ingrese un nuevo taxi y le asignara un viaje desde la terminal 0003

k) Desarrolle una funcionen almacenada que devuelva el conjunto de


datos de los talleres, nombre y ciudad, y de los de taxis asociados
a cada taller para mantenimiento. Deben estar agrupados por taller
y ordenados por placa de taxi.

CREATE OR REPLACE FUNCTION conjunto_talleres(


OUT parametro1 character varying,
OUT parametro2 character varying,
OUT parametro3 character varying,
OUT parametro4 character varying,
OUT parametro5 character varying)

RETURNS SETOF record AS

$BODY$
DECLARE
BEGIN

RETURN query select t.nombre as taller_nombre , t.ciudad as


taller_ciudad, taxi.placa ,taxi.marca,taxi.modelo
from taller_taxi as tb INNER JOIN taller as t ON t.codt=tb."TALLERcodt"
INNER JOIN taxi ON tb."TAXIplaca"=taxi.placa group by taller_nombre,
taller_ciudad, taxi.placa ,taxi.marca,taxi.modelo order by taxi.placa
asc;

RETURN;
END;
$BODY$
LANGUAGE plpgsql;

SELECT conjunto_talleres();

l) Cree un disparador que garantice que ningn registro de la tabla


cliente sea nulo.

CREATE OR REPLACE FUNCTION tg_datos_nulos() RETURNS TRIGGER AS $$

BEGIN

IF NEW.codc IS NULL THEN


RAISE EXCEPTION 'EL codigo de cliente no puede ser nulo ';
END IF;

IF NEW.nombre IS NULL THEN


RAISE EXCEPTION 'EL nombre de cliente no puede ser nulo ';
END IF;

IF NEW.apellido IS NULL THEN


RAISE EXCEPTION 'EL apellido de cliente no puede ser nulo ';
END IF;

IF NEW.ciudad IS NULL THEN


RAISE EXCEPTION 'La ciudad de cliente no puede ser nulo ';
END IF;

RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER triggers_cliente_nulo BEFORE INSERT OR UPDATE ON cliente


FOR EACH ROW EXECUTE PROCEDURE triggers_cliente_nulo();

Como lo indica el enunciado, este disparador se activara cuando se


ingrese un nuevo cliente y algn campo est vaco.
n) Segn la siguiente tabla:
CREATE TABLE tbl_audit (
pk_audit serial NOT NULL,
"NomTabla" character(45) NOT NULL,
"Operacion" char(1) NOT NULL,
"ViejoValor" text,
"NuevoValor" text,
"FechaModif" timestamp without time zone NOT NULL,
"Usuario" character(45) NOT NULL,
CONSTRAINT pk_audit PRIMARY KEY (pk_audit));

Elabore un disparador que registre las operaciones de eliminacin, inclusin y


actualizacin sobre tabla taxi.

CREATE OR REPLACE FUNCTION tg_taxi_audit() RETURNS trigger AS


$$
BEGIN
--**SI OCURRE UN DELETE**--
IF (TG_OP = 'DELETE') THEN
INSERT INTO tbl_audit ("NomTabla", "Operacion", "ViejoValor",
"NuevoValor", "FechaModif", "Usuario")
VALUES (TG_TABLE_NAME, 'D', OLD, NULL, now(), USER);
RETURN OLD;
--**SI OCURRE UN UPDATE**--
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO tbl_audit ("NomTabla", "Operacion", "ViejoValor",
"NuevoValor", "FechaModif", "Usuario")
VALUES (TG_TABLE_NAME, 'U', OLD, NEW, now(), USER);
RETURN NEW;
--**SI OCURRE UN INSERT**--
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO tbl_audit ("NomTabla", "Operacion", "ViejoValor",
"NuevoValor", "FechaModif", "Usuario")
VALUES (TG_TABLE_NAME, 'I', NULL, NEW, now(), USER);
RETURN NEW;
END IF;
RETURN NULL;
END;
$$
LANGUAGE 'plpgsql;

CREATE TRIGGER tbl_audit_taxi AFTER INSERT OR UPDATE OR DELETE


ON taxi FOR EACH ROW EXECUTE PROCEDURE tg_taxi_audit();

El disparador ser ejecutado antes de la ejecucin de una instruccin


INSERT, UPDATE y DELETE en la tabla indicada (taxi).

SELECT * FROM tbl_audit();

También podría gustarte