Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/06/2016, 17:17
Avatar de AVBorland
AVBorland
 
Fecha de Ingreso: marzo-2016
Ubicación: Moscu
Mensajes: 42
Antigüedad: 8 años, 8 meses
Puntos: 4
Respuesta: Trigger Oracle se crea pero no Actualiza

Buenos noches!

1. Datos inicialos:

Código SQL:
Ver original
  1. CREATE TABLE Prestamo(
  2.  idLector NUMERIC(10) NOT NULL,
  3.  idLibro NUMERIC(10) NOT NULL,
  4.  FechaPrestamo DATE NOT NULL,
  5.  FechaDev DATE  NULL,
  6.  FechaRealDev DATE NULL,
  7.  Mora NUMBER(19,4) NULL,
  8.  estado NUMBER(1) NULL
  9. );
  10. INSERT INTO Prestamo VALUES (1,1,to_date('09-06-2016','DD-MM-YYYY'),to_date('12-06-2016','DD-MM-YYYY'),'','',0);
  11. INSERT INTO Prestamo VALUES (1,2,to_date('09-06-2016','DD-MM-YYYY'),to_date('12-06-2016','DD-MM-YYYY'),'','',0);
  12. INSERT INTO Prestamo VALUES (1,3,to_date('09-06-2016','DD-MM-YYYY'),to_date('12-06-2016','DD-MM-YYYY'),'','',0);
  13.  
  14. SQL> SELECT * FROM prestamo;
  15.  
  16.   IDLECTOR    IDLIBRO FECHAPRES FECHADEV  FECHAREAL       MORA     ESTADO
  17. ---------- ---------- --------- --------- --------- ---------- ----------
  18.          1          1 09-JUN-16 12-JUN-16                               0
  19.          1          2 09-JUN-16 12-JUN-16                               0
  20.          1          3 09-JUN-16 12-JUN-16                               0
  21.  
  22. SQL>

2. Realizo triggeros:
Código SQL:
Ver original
  1. CREATE OR REPLACE package Test_Package AS
  2.   TYPE TTmpRec IS TABLE OF INTEGER INDEX BY Binary_integer;
  3.   TYPE TTmpTabla IS TABLE OF TTmpRec INDEX BY binary_integer;
  4.  
  5.   TempTabla TTmpTabla;
  6.   Latch BOOLEAN:=FALSE;
  7.   PROCEDURE Update_Data;
  8. END;
  9. /
  10.  
  11. CREATE OR REPLACE package body Test_Package AS
  12.  i INTEGER;
  13.  j INTEGER;
  14.  PROCEDURE Update_Data AS
  15.   BEGIN
  16.    latch := TRUE;
  17.    IF test_Package.TempTabla.Count>0 THEN
  18.      i:=test_Package.TempTabla.FIRST;
  19.      while i IS NOT NULL loop
  20.        j:=test_Package.TempTabla(i).FIRST;
  21.        while j IS NOT NULL loop
  22.          UPDATE Prestamo SET Mora=test_Package.TempTabla(i)(j) WHERE idLector=i AND idLibro=j;
  23.          j:=test_Package.TempTabla(i).NEXT(j);
  24.        END loop;
  25.        i:=test_Package.TempTabla.NEXT(i);
  26.      END loop;
  27.    END IF;
  28.    latch := FALSE;
  29.   exception WHEN others THEN  
  30.   latch := FALSE;
  31.   raise;
  32.    latch := FALSE;
  33.   END;
  34. END;
  35. /
  36.  
  37. CREATE OR REPLACE TRIGGER TR_CALCULARMORA_TMP
  38.     AFTER UPDATE
  39.      ON Prestamo
  40.      FOR EACH ROW
  41.     DECLARE
  42.         dias INTEGER;
  43.     BEGIN
  44.          DIAS := TRUNC(SYSDATE) - :NEW.FECHADEV;
  45.          IF dias > 3 THEN
  46.           Test_Package.TempTabla(:OLD.idLector)(:OLD.idLibro):=(dias-3)*5;
  47.          END IF;
  48.     END;
  49. /
  50.  
  51. CREATE OR REPLACE TRIGGER TR_CALCULARMORA
  52. After INSERT OR UPDATE OR DELETE ON Prestamo
  53. BEGIN  
  54.   IF NOT test_Package.Latch THEN
  55.     Test_Package.Update_Data;
  56.   END IF;
  57. END;
  58. /
  59.  
  60. CREATE OR REPLACE TRIGGER Init_TEST
  61. BEFORE INSERT OR UPDATE OR DELETE ON Prestamo
  62. BEGIN
  63.   IF NOT Test_Package.latch THEN
  64.     Test_Package.TempTabla.DELETE();
  65.   END IF;
  66. END;
  67. /

3. Resultado:
Código BASH:
Ver original
  1. SQL> select * from prestamo;
  2.  
  3.   IDLECTOR    IDLIBRO FECHAPRES FECHADEV  FECHAREAL       MORA     ESTADO
  4. ---------- ---------- --------- --------- --------- ---------- ----------
  5.          1          1 09-JUN-16 12-JUN-16                               0
  6.          1          2 09-JUN-16 12-JUN-16                               0
  7.          1          3 09-JUN-16 12-JUN-16                               0
  8.  
  9. SQL> UPDATE Prestamo SET FECHADEV=to_date('10-06-2016','DD-MM-YYYY') WHERE idLector=1 ;
  10.  
  11. 3 rows updated.
  12.  
  13. SQL> commit;
  14.  
  15. Commit complete.
  16.  
  17. SQL> select * from prestamo;
  18.  
  19.   IDLECTOR    IDLIBRO FECHAPRES FECHADEV  FECHAREAL       MORA     ESTADO
  20. ---------- ---------- --------- --------- --------- ---------- ----------
  21.          1          1 09-JUN-16 10-JUN-16                   10          0
  22.          1          2 09-JUN-16 10-JUN-16                   10          0
  23.          1          3 09-JUN-16 10-JUN-16                   10          0
  24.  
  25. SQL> select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
  26.  
  27. TO_CHAR(SYSDATE,'DD
  28. -------------------
  29. 15-06-2016 02:16:46
  30.  
  31. SQL>SQL> UPDATE Prestamo SET FECHADEV=to_date('11-06-2016','DD-MM-YYYY') WHERE idLeсtor=1;
  32.  
  33. 3 rows updated.
  34.  
  35. SQL> commit;
  36.  
  37. Commit complete.
  38.  
  39. SQL> select * from prestamo;
  40.  
  41.  IDLECTOR    IDLIBRO FECHAPRES FECHADEV  FECHAREAL       MORA     ESTADO
  42. ---------- ---------- --------- --------- --------- ---------- ----------
  43.         1          1 09-JUN-16 11-JUN-16                    5          0
  44.         1          2 09-JUN-16 11-JUN-16                    5          0
  45.         1          3 09-JUN-16 11-JUN-16                    5          0
  46.  
  47. SQL>

Última edición por AVBorland; 15/06/2016 a las 04:22