Oracle - ERROR al tratar de insertar con trigger

 
Vista:
sin imagen de perfil

ERROR al tratar de insertar con trigger

Publicado por Trillante (3 intervenciones) el 13/01/2018 13:18:18
Hola buenas. Soy nuevo aquí y vengo para preguntarles dónde se encuentra el error en el código (exact match returns..) ya que me estoy comiendo la cabeza y sigo sin encontrarlo. Resulta que el Trigger funciona con las dos primeras inserciones en la tabla Convocatoria pero en la tercera me devuelve el error que dejo abajo. Muchas gracias!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE ALUMNO_US(
    OID_AL  number(8)   NOT NULL PRIMARY KEY,
    dni         CHAR(9) NOT NULL CHECK (LENGTH(dni)=9),
    nombre      VARCHAR2(50) ,
    apellido    VARCHAR2(50) ,
    email       VARCHAR2(50) check (email LIKE '%@%'),
    telefono    INTEGER,
    fechaNacimiento DATE
    );
 
CREATE TABLE CONVOCATORIA(
    OID_CON number(8) NOT NULL PRIMARY KEY,
    numero  INTEGER NOT NULL,
    tipo    VARCHAR2(20) NOT NULL,
    fechaApertura DATE,
    fechaCierre   DATE,
    CONSTRAINT chk_fechaCierre check(fechaCierre > fechaApertura),
    OID_AL  number(8),
    OID_AC number(8),
    FOREIGN KEY (OID_AL) REFERENCES ALUMNO_US ON DELETE CASCADE,
    FOREIGN KEY (OID_AC) REFERENCES ALUMNOSCONVOCATORIA ON DELETE CASCADE
     );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
delete alumno_us;
delete convocatoria;
 
create or replace trigger fechaCon
after insert  ON convocatoria
declare
fechaA number;
fechaC number;
begin
select extract(year from fechaApertura) into fechaA from convocatoria;
select extract(year from fechaCierre) into fechaC from convocatoria;
 
if (fechaC != fechaA + 1)
then raise_application_error (-20600, ' El año de la fecha de cierre de la convocatoria tiene que ser superior en una unidad al año de la fecha de cierre de dicha convocatoria');
end if;
end;
/
alter trigger fechaCon enable;
insert into alumno_us values ('1', '897453621', 'Paco', 'Burro', 'paco@gmail.com','786765123', to_date('03/03/1997','DD/MM/YYYY'));
insert into alumno_us values ('2', '897453621', 'Paco', 'Burro', 'paco@gmail.com','786765123', to_date('03/03/1998','DD/MM/YYYY'));
insert into alumno_us values ('3', '89745321', 'Paco', 'Burro', 'paco@gmail.com','786765123', to_date('03/03/1999','DD/MM/YYYY'));
insert into convocatoria values ('1', '78123', 'ERASMUS', to_date('09/12/1999','DD/MM/YYYY'),to_date('12/12/2001','DD/MM/YYYY'),'1', null);
insert into convocatoria values ('2', '78123', 'ERASMUS', to_date('11/12/1999','DD/MM/YYYY'),to_date('12/12/2000','DD/MM/YYYY'),'2', null);
insert into convocatoria values ('3', '78122', 'TRAINING', to_date('10/12/1995','DD/MM/YYYY'),to_date('12/12/2002','DD/MM/YYYY'),'3', null);
Log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
3 filas eliminado
 
 
0 filas eliminado
 
 
Trigger FECHACON compilado
 
 
Trigger FECHACON alterado.
 
 
1 fila insertadas.
 
 
1 fila insertadas.
 
 
1 fila insertadas.
 
 
Error que empieza en la línea: 22 del comando :
insert into convocatoria values ('1', '78123', 'ERASMUS', to_date('09/12/1999','DD/MM/YYYY'),to_date('12/12/2001','DD/MM/YYYY'),'1', null)
Informe de error -
ORA-20600:  El año de la fecha de cierre de la convocatoria tiene que ser superior en una unidad al año de la fecha de cierre de dicha convocatoria
ORA-06512: at "PRUEBAS.FECHACON", line 9
ORA-04088: error during execution of trigger 'PRUEBAS.FECHACON'
 
 
1 fila insertadas.
 
 
Error que empieza en la línea: 24 del comando :
insert into convocatoria values ('3', '78122', 'TRAINING', to_date('10/12/1995','DD/MM/YYYY'),to_date('12/12/2002','DD/MM/YYYY'),'3', null)
Informe de error -
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "PRUEBAS.FECHACON", line 5
ORA-04088: error during execution of trigger 'PRUEBAS.FECHACON'
El OID_AC está a null porque no he creado otra tabla, que no es necesaria para comprobar el correcto funcionamiento del trigger
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
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

ERROR al tratar de insertar con trigger

Publicado por gilman (52 intervenciones) el 17/01/2018 09:05:56
El problema está en las sentencias:

1
2
3
select extract(year from fechaApertura) into fechaA from convocatoria;
 
select extract(year from fechaCierre) into fechaC from convocatoria;
Deberían devolver un único registro, pero al ingresar el segundo registro devuelve 2 registros y por eso falla.
Sustitúyelas por:
1
2
fechaA:=extract (year from :new.fechaApertura) ;
fechaC:=extract(year from :new.fechaCierre) ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

ERROR al tratar de insertar con trigger

Publicado por Trillante (3 intervenciones) el 20/01/2018 13:59:43
Muchas gracias amigo, efectivamente se solucionó el problema mediante esa correción!!
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