Bases de Datos - Ejercicio

 
Vista:

Ejercicio

Publicado por Nikeman (1 intervención) el 17/01/2022 14:58:41
Buenas!

estoy estudiando base de datos y actualmente estoy con procedimientos, cursores y triggers. Tengo un ejercicio que consiste sobre una tabla llamada Incidencias, solicitar la entrada a través del teclado de los datos de cada una de las columnas, verificar que no se haya registrado el nº de incidencia antes (IdIncidencia), en caso negativo, se registra correctamente, en caso negativo indicar que esa incidencia ya existe.

Aviso a navegantes que estoy aprendiendo y que estoy bebiendo de todas las fuentes que puedo para comprender, lo digo porque el código está seguro incompleto y seguramente mal. Os lo pasteo:

CREATE OR REPLACE PROCEDURE entrar_incidencia(
IdIncidencia NUMBER (2):= '&IdIncidencia';
Equipo NUMBER (2):= '&Equipo';
Descripción VARCHAR (100):= '&Descripción';
Fechahora TIMESTAMP (6):= 'Fechahora';
Trabajador NUMBER (2):= '&Trabajador';
IdIncidenciaExistente EXCEPTION;)

AS
CURSOR c_incidencia IS SELECT IdIncidencia
FROM Incidencias
v_


BEGIN
OPEN c_incidencia;
FETCH c_incidencia INTO
IF IdIncidencia EXISTS THEN
RAISE IdIncidenciaExistente
END IF;

EXCEPTION
WHEN IdIncidenciaExistente THEN
dbms_output.put_line('El número de incidencia ya existe');
RAISE;
WHEN OTHERS THEN
dbms_output.put_line('La incidencia se ha registrado correctamente');

END entrar_incidencia;
/

Seguramente esté enrredando con muchas cosas. Lo que quiero es eso, que si la Id de la incidencia ya existe, me indique que ya existe y sino que la registre. ¿Me echáis una mano?, ¿Alguna fuente donde aprender bien cómo funciona toda esta parte de pl sql?

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ejercicio

Publicado por anonimous (4 intervenciones) el 24/02/2022 15:50:43
Hola Nikeman.
Tienes efectivamente unos errores normales de todo principiante, que la experiencia y práctica irán mejorando con el tiempo.
Para empezar, no es necesario que indiques el tipo de dato en los parámetros, pues en Oracle basta con indicar el nombre de la tabla seguido de %TYPE y con ello automáticamente tomará el tipo de dato que se le definió en la estructura, de manera que si más adelante cambias el tipo de dato en la tabla, el procedimiento no se afecta, pero hacerlo como lo estás haciendo, hace que tengas que recompilar el procedure, cada vez que quieras hacer un alter del tipo de dato en la estructura.

CREATE OR REPLACE PROCEDURE SPR_Incidencia(
p_IdIncidencia IN Incidencias.IdIncidencia%TYPE,
p_Equipo IN Incidencias.IdIncidencia%TYPE,
p_Descripción IN Incidencias.IdIncidencia%TYPE,
p_Fechahora IN Incidencias.IdIncidencia%TYPE,
p_Trabajador IN Incidencias.IdIncidencia%TYPE,
p_Resultado OUT NUMERIC)

IS
v_IdIncidencia Incidencias.IdIncidencia%TYPE:= 0;

CURSOR Cur_Incidencia IS
SELECT IdIncidencia
FROM Incidencias
WHERE IdIncidencia = p_IdIncidencia;

BEGIN
p_Resultado := 0;
OPEN Cur_Incidencia ;
FETCH Cur_Incidencia INTO v_IdIncidencia;
CLOSE Cur_Incidencia;

IF (v_IdIncidencia <> 0) THEN
p_Resultado:= -1;
ELSE
INSERT INTO Incidencias (IdIncidencia, Equipo, Descripción, Fechahora, Trabajador)
VALUES(P_IdIncidencia, P_Equipo, P_Descripción, P_Fechahora, P_Trabajador);
COMMIT;
END IF;

EXCEPTION
WHEN OTHERS THEN
p_Resultado:= SUBSTR(SQLCODE,1,20);

END SPR_Incidencia;

Si el devuelve 0 es porque la transacción (Insert) fue efectiva
Si devuelve -1 es porque ese id de incidencia ya existe.
Si devuelve otro valor diferente de 0 y -1 es otro tipo de error

Recomiendo que en la tabla definas la columna fecha de tipo Date con un default (DEFAULT SYSDATE), para que así no tengas que enviarlo en el procedure, sino que sea la tabla la que tome la fecha en la cual hacen el insert
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejercicio

Publicado por anonimous (4 intervenciones) el 24/02/2022 16:07:55
Por hacer copy-paste se me fue un error en los nombres de columnas, reemplaza la primera parte así:

CREATE OR REPLACE PROCEDURE SPR_Incidencia(
p_IdIncidencia IN Incidencias.IdIncidencia%TYPE,
p_Equipo IN Incidencias.Equipo%TYPE,
p_Descripción IN Incidencias.Descripción%TYPE,
p_Fechahora IN Incidencias.Fechahora%TYPE,
p_Trabajador IN Incidencias.Trabajador%TYPE,
p_Resultado OUT NUMERIC)

Y finalmente pensaría que ese IdIncidencia debería ser una secuencia que se autoincremente, y lo que habría que validar ya no es ese id, sino el equipo, pero no sé si lo que intentas modelar es un sistema mantenimiento de equipos, en cuyo caso si podría repetirse el equipo.

Ya me tendrías que decir bien como son las reglas del negocio, para proceder...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar