Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.55 KB | None | 0 0
  1. CREATE OR REPLACE TRIGGER trigger_trecho_teste
  2. FOR DELETE OR UPDATE OF shape ON tr_eixo_lt_ope
  3. COMPOUND TRIGGER
  4.    -- Declarative Section (optional)
  5.    -- Variables declared here have firing-statement duration.
  6.      TYPE num_list IS TABLE OF NUMBER;
  7.      trechos num_list;
  8.      
  9.      --Trechos :
  10.      TYPE trechos_update IS VARRAY(2) OF sde.st_geometry; -- This will contain old/new or old/null of trechos  
  11.      TYPE trecho_dict IS TABLE OF trechos_update INDEX BY PLS_INTEGER; -- This is a dictionary of the above, with keys as the cod
  12.      trechos_dict trecho_dict;
  13.      
  14.      --Lts :
  15.      TYPE trechos_in_lt_to_update IS TABLE OF trechos_update; -- List of trechos above in specific LT
  16.      TYPE lt_dict IS TABLE OF trechos_in_lt_to_update INDEX BY PLS_INTEGER; -- Dictionary of the above
  17.      lts_dict lt_dict;
  18.      
  19.      -- Auxiliar de iteração :
  20.      elem trechos_in_lt_to_update;
  21.    
  22.      --Executed before each row change- :NEW, :OLD are available
  23.      BEFORE EACH ROW IS
  24.      BEGIN
  25.         trechos.extend;
  26.         IF UPDATING THEN
  27.             trechos(trechos.COUNT) := :NEW.PK_CD_TR_LT_OPE;
  28.             trechos_dict(:NEW.PK_CD_TR_LT_OPE) := trechos_update(:OLD.SHAPE, :NEW.SHAPE);
  29.         ELSE
  30.             trechos(trechos.COUNT) := :OLD.PK_CD_TR_LT_OPE;
  31.             trechos_dict(:NEW.PK_CD_TR_LT_OPE) := trechos_update(:OLD.SHAPE, NULL);
  32.         END IF;
  33.            
  34.      END BEFORE EACH ROW;
  35.    
  36.      --Executed aftereach row change- :NEW, :OLD are available
  37.      AFTER EACH ROW IS
  38.      BEGIN
  39.        NULL;
  40.      END AFTER EACH ROW;
  41.    
  42.      --Executed after DML statement
  43.      AFTER STATEMENT IS
  44.      BEGIN
  45.         -- Construindo o dicionário com as lts e os seus trechos modificados
  46.         FOR resultado IN (SELECT FK_CD_LT_OPE cod_lt,FK_CD_TR_LT_OPE cod_trecho FROM EIXO_LT_OPE_COM_TR_EIXO_LT_OPE WHERE FK_CD_TR_LT_OPE MEMBER OF trechos)
  47.         LOOP
  48.             IF lts_dict.EXISTS(resultado.cod_lt) THEN
  49.                 lts_dict(resultado.cod_lt).extend;
  50.                 lts_dict(resultado.cod_lt)(lts_dict(resultado.cod_lt).COUNT) := trechos_dict(cod_trecho);
  51.             ELSE
  52.                 lts_dict(resultado.cod_lt) := trechos_in_lt_to_update(trechos_dict(cod_trecho));
  53.             END IF;
  54.         END LOOP;
  55.        
  56.        -- Iterando o dicionário construído acima
  57.         elem := lts_dict.FIRST;
  58.         WHILE elem IS NOT NULL LOOP
  59.             elem := lts_dict.next(elem);
  60.             cogeo_utils.rebuild_line('tr_eixo_lt_ope', elem, lts_dict(elem));
  61.         END LOOP;
  62.      END AFTER STATEMENT;
  63. END trigger_trecho_teste;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement