• Domingo 22 de Diciembre de 2024, 19:04

Autor Tema:  triggers  (Leído 831 veces)

cristy

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
triggers
« en: Viernes 20 de Diciembre de 2002, 19:42 »
0
hola a todos, tengo una consulta que elimina, pero me envia un error e un triggers que es para otra tabla este es el triggers y la tabla a eliminar se llama l_identi




TRIGGER "SONDAJES".mod_t_lycumo
AFTER INSERT OR UPDATE OR DELETE
ON T_LYCUMO
FOR EACH ROW
/*
TRIGGER diseñado para actualizar la tabla L_LYCUMO_COORD
cuando se modifica la tabla T_LYCUMO
DECLARE

CURSOR lista_sonda (cyac NUMBER,clab CHAR) IS
SELECT *
FROM t_identi
WHERE yacimiento=cyac
AND codlabor=clab
ORDER BY CODLABOR;
 
CURSOR lista_trayec(cyac NUMBER, clab CHAR) IS
SELECT *
FROM t_trayec
WHERE (yacimiento = cyac ) AND  
      (codlabor = clab);

CURSOR lista_lycumo(cyac NUMBER, clab CHAR, metini NUMBER, metfin NUMBER) IS
SELECT *
FROM t_lycumo
WHERE (yacimiento = cyac ) AND  
      (codlabor = clab) AND
      (metfinal>metini AND metfinal<=metfin);

l_s lista_sonda%ROWTYPE;
l_t lista_trayec%ROWTYPE;
l_cu lista_lycumo%ROWTYPE;

metini    NUMBER;
metfin    NUMBER;
metant   NUMBER;
x0        NUMBER;
y0        NUMBER;
z0        NUMBER;
x1        NUMBER;
y1        NUMBER;
z1        NUMBER;
xm        NUMBER;
ym        NUMBER;
zm        NUMBER;
rumb      NUMBER;
incl      NUMBER;
codigo_yac NUMBER;
codigo_labor VARCHAR2(8);
gr           NUMBER;
ind          NUMBER;


BEGIN

if (inserting) then
  codigo_yac:=:new.yacimiento;
  codigo_labor:=:new.codlabor;
end if;
if (updating) then
  codigo_yac:=:new.yacimiento;
  codigo_labor:=:new.codlabor;
  DELETE FROM L_LYCUMO_COORD
    WHERE yacimiento=:new.yacimiento AND codlabor=:new.codlabor;
end if;
if (deleting) then
  codigo_yac:=:old.yacimiento;
  codigo_labor:=:old.codlabor;
  DELETE FROM L_LYCUMO_COORD
    WHERE yacimiento=:old.yacimiento AND codlabor=:old.codlabor;
end if;

/*INICIO*/
  gr:=3.14159265359/180.0;
  OPEN lista_sonda(codigo_yac,codigo_labor);
  LOOP
    FETCH lista_sonda INTO l_s;
    EXIT WHEN lista_sonda%NOTFOUND;
    metini:=0;
    x0:=l_s.longitud;
    y0:=l_s.latitud;
    z0:=l_s.cota;
    OPEN lista_trayec(l_s.yacimiento,l_s.codlabor);
    LOOP
      FETCH lista_trayec INTO l_t;
      EXIT WHEN lista_trayec%NOTFOUND;
      metfin:=l_t.metfinal;
      IF metfin>0 THEN
        rumb:=gr*(l_t.azigrd+l_t.azimin/60+l_t.aziseg/3600);
        IF l_t.incgrd>0 THEN
          incl:=gr*(l_t.incgrd+l_t.incmin/60+l_t.incseg/3600);
        ELSE
          incl:=gr*(l_t.incgrd-l_t.incmin/60-l_t.incseg/3600);
        END IF;
        metant:=metini;
        ind:=0;
        OPEN lista_lycumo(l_t.yacimiento,l_t.codlabor,metini,metfin);
        LOOP
          FETCH lista_lycumo INTO l_cu;
          EXIT WHEN lista_lycumo%NOTFOUND;
          xm:=x0+(l_cu.metfinal+metant)/2*sin(rumb)*cos(incl);
          ym:=y0+(l_cu.metfinal+metant)/2*cos(rumb)*cos(incl);
          zm:=z0+(l_cu.metfinal+metant)/2*sin(incl);
          INSERT INTO L_LYCUMO_COORD VALUES (l_s.yacimiento,l_s.codlabor,xm,ym,zm);
          metant:=l_cu.metfinal;
          ind:=1;
        END LOOP;
        CLOSE lista_lycumo;
        x1:=x0+metfin*sin(rumb)*cos(incl);
        y1:=y0+metfin*cos(rumb)*cos(incl);
        z1:=z0+metfin*sin(incl);
        IF ind<1 THEN
          xm:=(x0+x1)/2;
          ym:=(y0+y1)/2;
          zm:=(z0+z1)/2;
          INSERT INTO L_LYCUMO_COORD VALUES (l_s.yacimiento,l_s.codlabor,xm,ym,zm);
        END IF;
        x0:=x1;
        y0:=y1;
        z0:=z1;
      END IF;
      metini:=metfin;
    END LOOP;
    CLOSE lista_trayec;
    commit;
  END LOOP;
  CLOSE lista_sonda;
/*FIN*/
end mod_t_lycumo;