giovedì 28 maggio 2015

OWM - Come verificare le differenze su una stessa tabella tra workspace diversi - parte II

Nella parte I abbiamo visto come trovare le differenze utilizzando le features del prodotto, adesso vediamo come ottenere lo stesso o quasi risultato non utilizzando le funzioni di prodotto.
Partiamo dal presupposto di dover confrontare una tabella posta nel workspace LIVE ed una posta in un workspace figlio di LIVE e di voler estrarre le differenze.

Per estrarre le differenze effettueremo delle minus tra la vista xxx_HIST filtrata per WS=LIVE e la tabella presente nel WS figlio e viceversa. Per semplificare un pò considereremo sulla tabella xxx_HIST solo che le operazioni fatte sul record devono essere diversa da DELETE. Se poi vogliamo estrarre anche i record cancellati o sul WS figlio o sul LIVE basta omettere la condizione nel filtro.

Come primo step ci posizioniamo nel WS figlio verificando che se già non ci siamo:

...
SELECT DBMS_WM.GetWorkspace  into v_get_owks FROM DUAL;

IF v_get_owks!=v_owks_child THEN
dbms_wm.GotoWorkspace(v_owks_child);
END IF;

...

 A questo punto possiamo fare la prima minus tra ciò che è presente sul LIVE e ciò che è presente nella tabella:

SELECT '||V_TAB_COLUMNS||' FROM
  (SELECT A.* ,  

          ROW_NUMBER () 
           OVER (PARTITION BY WM_workspace,'||V_PKEY_COLS||'
                 ORDER BY WM_workspace,'||V_PKEY_COLS||',
                          WM_CREATETIME DESC,  

                 NVL(WM_RETIRETIME,TO_DATE(''01019900'',''DDMMYYYY'')) DESC) RW
    FROM '||TABLE||'_HIST A)
   WHERE RW=1 AND WM_WORKSPACE=''LIVE'' AND  WM_OPTYPE<>''D'' AND (:v_where)

MINUS 
SELECT '||V_TAB_COLUMNS||' FROM '||
TABLE||' WHERE (:v_where)    

dove:
V_TAB_COLUMNS   sono le colonne della vista senza le colonne di prodotto
V_PKEY_COLS        sono le colonne della chiave della tabella  
v_where                    è una eventuale condizione di filtro comune ad entrambe le viste.

Per ottenere le differenze inverse basta invertire la minus.
Questa soluzione tuttavia risulta poco efficiente in quanto è valida solo per i confronti con il WS LIVE.
Quindi anche se possibile utilizzarla la scarterei a priori a favore della soluzione illustrata nell'articolo parte I.
Perchè ne abbiamo parlato? perchè potrebbe essere utile fare un confronto veloce col LIVE e poi avevo scritto la query...

Nessun commento:

Posta un commento