Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

trigger pl/sql oracle

Estas en el tema de trigger pl/sql oracle en el foro de Oracle en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 08/10/2012, 11:19
 
Fecha de Ingreso: octubre-2012
Ubicación: Panama
Mensajes: 1
Antigüedad: 11 años, 6 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.
  #2 (permalink)  
Antiguo 02/11/2012, 10:46
Avatar de thomas_2417  
Fecha de Ingreso: noviembre-2012
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: trigger pl/sql oracle

Para mi punto de vista te hiso falta la union es decir el inner join de cada tabla en el declare por ejemplo:
From estudiantes inner join notas on numero number(5)=numero number(5)
y de igual manera con la nota y la distribucion_de_notas...

Etiquetas: avg(), cursor, sum(), trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:23.