Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/10/2012, 11:19
elights
 
Fecha de Ingreso: octubre-2012
Ubicación: Panama
Mensajes: 1
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta trigger pl/sql oracle

Buenas, soy nuevo tanto en oracle como en el foro y quisiera saber si me pueden ayudar con el siguiente trigger

en realidad lo que necesito es un trigger que al incertar el valor del semestral(S) en la tabla notas realice las siguientes acciones:

1.- saque el promedio por TIPO DE NOTA, y lo multiplique por el porcentaje respectivo
2.- sume todos los resultados de la operacion anterior para obtener una NOTA TOTAL,
3.- transforme esa NOTA TOTAL, en NOTA FINAL (A,B,C,D O F)
4.- incerte los valores en la tabla TMP

aqui esta la estructura de mi base de datos y el trigger que yo cree:

Tablas:

DISTRIBUCION_DE_NOTAS
TIPO_NOTA CHAR(1),pk (ESTO ES PARA DIFERENCIAR ENTRE P DE PARCIAL, L DE LABORATORIO, Q DE QUIZ Y S DE SEMESTRAL)
DESCRIPCION(VARCHAR2(15)
PORCENTAJE NUMBER(5,2);

ESTUDIANTES
NUMERO NUMBER(5),pk
NOMBRE VARCHAR2(15),
APELLIDO VARCHAR2(15),
CEDULA VARCHAR2(15),
S_SOCIAL VARCHAR2(15),
E_MAIL VARCHAR2(15);

NOTAS
NUMERO NUMBER(5) fk_ESTUDIANTES
TIPO_NOTA CHAR(1), fk_DISTRIBUCION_DE_NOTAS
FECHA DATE,
VALOR NUMBER(5,2), (AQUI VA CUANTO SACO EL ALUMNO EN DICHA EVALUACION)

TMP_ESTUDIANTES_PRO_FINAL
NUMERO NUMBER(5) fk_ESTUDIANTES,
NOMBRE VARCHAR2(15),
APELLIDO VARCHAR2(15),
PRO_FINAL NUMBER(5,2),
NOTA_FINAL CHAR(1) (AQUI SE COLOCA SI LA NOTA FINAL DEL ESTUDIANTE ES A, B, C, D O F)

EL TRIGGER ES
Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER t_nota_final
  2. BEFORE INSERT OR UPDATE ON NOTAS
  3. FOR EACH ROW
  4. WHEN (NEW.TIPO_NOTA='S')
  5. DECLARE
  6. nota_final CHAR (1);
  7. CURSOR c_notas IS
  8. SELECT E.NOMBRE, E.APELLIDO, N.TIPO_NOTA, SUM(AVG(N.VALOR) * D.PORCENTAJE/100) TOTAL_NOTA
  9. FROM ESTUDIANTES E, NOTAS N, DISTRIBUCION_DE_NOTAS D
  10. WHERE E.NUMERO = :NEW.NUMERO
  11. AND N.NUMERO = :NEW.NUMERO
  12. AND N.TIPO_NOTA = D.TIPO_NOTA
  13. GROUP BY E.NOMBRE,E.APELLIDO,N.TIPO_NOTA;
  14. BEGIN
  15. FOR i IN c_notas LOOP
  16.   IF (i.TOTAL_NOTA < 61 ) THEN
  17.     nota_final := 'F';
  18.   ELSIF (i.TOTAL_NOTA < 71 ) THEN
  19.     nota_final := 'D';
  20.   ELSIF (i.TOTAL_NOTA < 81 ) THEN
  21.     nota_final := 'C';
  22.   ELSIF (i.TOTAL_NOTA < 91 ) THEN
  23.     nota_final := 'B';
  24.   ELSE
  25.     nota_final := 'A';    
  26.   END IF;  
  27. INSERT INTO TMP_ESTUDIANTES_PRO_FINAL VALUES
  28. ( :NEW.NUMERO, i.NOMBRE, i.APELLIDO, i.TOTAL_NOTA, nota_final);
  29. END LOOP;
  30. END;

a pesar de que compila bien, el trigger no funciona.... por favor diganme que hice mal

Última edición por gnzsoloyo; 08/10/2012 a las 15:35 Razón: Sn etiqueta. Complicado para leer.