Alonso Suela Pilar BD06 Tarea
Alonso Suela Pilar BD06 Tarea
Alonso Suela Pilar BD06 Tarea
De los agentes queremos conocer su nombre, su clave y contraseña para entrar al sistema,
su categoría y su habilidad que será un número entre 0 y 9 indicando su habilidad para
atender llamadas.
Finalmente, para las oficinas queremos saber su nombre, domicilio, localidad y código postal
de la misma.
Crear un procedimiento que permita cambiar a todos los agentes de una familia
determinada (familia origen) a otra familia (familia destino).
El procedimiento tendrá la siguiente cabecera CambiarAgentesFamilia( id_FamiliaOrigen,
id_FamiliaDestino), donde cada uno de los argumentos corresponde a un identificador de
Familia. Cambiará la columna Identificador de Familia de todos los agentes, de la tabla
AGENTES, que pertenecen a la Familia con código id_FamiliaOrigen por el código
id_FamiliaDestino
Primero voy a crear las tablas e insertar los datos del anexo I.
id_familiaorigen agentes.familia%TYPE,
id_familiadestino agentes.familia%TYPE
--tengo que cambiar el atributo familia de todos los agentes que tengan la familia que
indica el id_FamiliaOrigen por el id_FamiliaDestino
AS
--declarar las variables que voy a necesitar, la primera para comprobar que el id de la familia
existe y la segunda para guardar las filas contadas ademas de las excepciones
v_id_familiadestino agentes.familia%TYPE;
v_contarfilas NUMBER(3);
iguales EXCEPTION;
nohayagentes EXCEPTION;
BEGIN
--para ello lo primero que tengo que hacer es comprobar que en la base de datos hay
agentes que tengan ese id familiaOrigen para poder ser cambiados por la de destino
--para ello contaremos las filas del id familia de la tabla agentes que corresponda con el
id_FamiliaOrigen
SELECT
COUNT(a.familia)
INTO v_contarfilas
FROM
agentes a
WHERE
a.familia = id_familiaorigen;
--También necesito comprobar que existe el id_FamiliaOrigen por lo tanto haré un select
SELECT
f.identificador
INTO v_id_familiadestino
FROM
familias f
WHERE
f.identificador = id_familiadestino;
IF ( v_contarfilas = 0 ) THEN
RAISE nohayagentes;
END IF;
RAISE no_data_found;
--UPDATE nombre-de-la-tabla
UPDATE agentes a
SET
a.familia = id_familiadestino;
ELSE
RAISE iguales;
END IF;
|| v_contarfilas
|| id_familiaorigen
|| ' a la
familia '
|| v_id_familiadestino);
EXCEPTION
END;
He cambiado los de la familia 11 a la 21
Pero no funciona
CORRECCIÓN
id_familia_origen agentes.familia%TYPE,
id_familia_destino agentes.familia%TYPE
) AS
v_numero NUMBER(9);
v_numerod NUMBER(9);
BEGIN
SELECT
COUNT(*)
INTO v_numero
FROM
agentes a
WHERE
a.familia = id_familia_origen;
SELECT
COUNT(*)
INTO v_numerod
FROM
familias f
WHERE
f.identificador = id_familia_destino;
UPDATE agentes a
SET
a.familia = id_familia_destino;
END IF;
END;
Ejecuto el procedimiento
declare
id_destino familias.identificador%TYPE:=&destino;
BEGIN
cambiarfamilia(id_origen,id_destino);
end;
Queremos controlar algunas restricciones a la hora de trabajar con agentes:
Todos los agentes deben pertenecer a una oficina o a una familia pero nunca a ambas a la
vez.
Se pide crear un disparador para asegurar estas restricciones. El disparador deberá lanzar
todos los errores que se puedan producir en su ejecución mediante errores que identifiquen
con un mensaje adecuado por qué se ha producido dicho error.
Voy a poner una captura de pantalla de algunas excepciones predefinidas en PLSQL para elegir
la que más se corresponda con el error producido.
Al final no he usado ninguna de las predefinidas por que no se adaptaban al error que se
mandaba, por lo tanto he definido yo algunas y otras he utilizado RAISE_APPLICATION_ERROR.
DECLARE
longitud_invalida EXCEPTION;
rango_invalido EXCEPTION;
longitudClave varchar2(6);
BEGIN
--la excepción será creada por mí ya que no encuentro una dentro de las excepciones
predefinidas
longitudclave:=to_char(:new.clave);
end if;
raise rango_invalido;
end if;
--La categoría de un agente sólo puede ser igual a 0, 1 o 2.
end if;
--Si un agente tiene categoría 2 no puede pertenecer a ninguna familia y debe pertenecer a
una oficina.
end if;
--Si un agente tiene categoría 1 no puede pertenecer a ninguna oficina y debe pertenecer a
una familia.
end if;
--Todos los agentes deben pertenecer a una oficina o a una familia pero nunca a ambas a la
vez.
RAISE_APPLICATION_ERROR(-20004, 'Un agente puede tener una familia o una oficina pero no
ambas a la vez.');
end if;
--Se pide crear un disparador para asegurar estas restricciones. El disparador deberá lanzar
todos los errores que se puedan producir en su ejecución mediante errores que identifiquen
con un mensaje adecuado por qué se ha producido dicho error.
EXCEPTION
END;
La forma en la que se pueden manejar estas restricciones con sentencias DDL es:
La longitud de la clave de un agente no puede ser inferior a 6.
Si un agente tiene categoría 2 no puede pertenecer a ninguna familia y debe pertenecer a una oficina.
Si un agente tiene categoría 1 no puede pertenecer a ninguna oficina y debe pertenecer a una familia.
Todos los agentes deben pertenecer a una oficina o a una familia pero nunca a ambas a la vez.
No se podrán manejar todas ellas, las únicas que he manejado con DDL son:
La habilidad de un agente debe estar comprendida entre 0 y 9 (ambos inclusive).