Fujitsu-Siemens
 
M A G A Z I N
 
SOFTWARE 
  Ivan Korać

"Stub" redovi

U jednom velikom data-warehouse sistemu, podaci stižu sa svih strana sveta, sa različitih platformi i u različitim formatima. Osnovna podela podataka u takvom sistemu je na master i transakcione podatke.
Prvi podrazumevaju slogove za parent tabele, gde se smeštaju uglavnom tekstualni opisi različitih id-a (šifarnici) i/ili hijerarhijski "visoki" podaci tj. potencijalne cube-dimenzije. Drugu grupu podataka čine "pravi" podaci (za fact tabele) sa mnoštvom spuštenih ključeva (forign key) iz ovih prvih.
U toj gunguli podataka koji se estrahuju iz svakojakih sistema, jedna od sasavim "regularnih" situacija je da vam stignu tzv. transakcioni podaci BEZ odgovarajućih master-a. Ono što vi znate, a sistem nezna je da će kasnije stići i master podaci, ali pošto imate (naravno) podignute kontrole na sistemu (constrainte) koji ne dozvoljavaju tako nešto, neće biti dozvoljena upsert (update ili insert) operacija.
Posledica: takvi transakcioni slogovi NEĆE biti ubačeni u DW.


I šta sad?


Tu počinje priča o takozvanim "stub" redovima i načinima za njihovo procesiranje.
Jedan od metoda kojim se obezbeđuje insert i ovakvih slogova u DW, uz svo poštovanje fk constraint-a, je da se dodaju nedostajući master redovi.
Za to je prvo potrebno definisati jedan user-defined exception (primer 1): npr. master_omitted, u kome će se prepoznati pokušaj narušavanja referencijelnog integriteta (oracle greška: -2291), a zatim parče koda koje treba da prepozna i "dopuni" nedostajuće master redove.

----------------------------------------------------------------------------------
PROCEDURE WriteWAR_Sales_Volume (
p_rec_sl WAR_SALES_VOLUME%ROWTYPE,
p_ParentRepLog IN MPCIROOT.MPCI_REPORT.T_MPCI_REPORT_LOG )
IS -------------------------------------------------------------------------------
l_RepLog MPCIROOT.MPCI_REPORT.T_MPCI_REPORT_LOG;
l_counter Number(9) := 0;
master_omitted EXCEPTION;
PRAGMA EXCEPTION_INIT(master_omitted, -2291);
BEGIN


Primer 1


U exception delu code-block-a se ispituje koji master redovi nedostaju (Primer 2). Treba "izvrteti" sve postojeće fk relacije jer se može desiti da za jedan transakcioni red nedostaje više master redova. Najefikasnije je to uraditi preko exist klauzule (u primeru) koja će proveriti postojanje master id-a samo do njegove prve pojave i time će se izbeći FTS (full table scan) operacija na obično, ogromnoj maste tabeli. Ako u master tabeli nema takvog, insertuje se slog i time se obezbeđuje da pri ponovnom pokušaju upserta transakcionog reda referencijalni integritet bude ispoštovan.

EXCEPTION
WHEN master_omitted
THEN
--
select count(*) into l_counter
from dual
where exists(select NULL
FROM WAR_DEALER
WHERE DEALER_CODE = p_rec_sl.DEALER_CODE);
if l_counter = 0
then
g_nCntMasterDEALER := g_nCntMasterDEALER + 1;
--
insert into WAR_DEALER(DEALER_CODE, MPCI_CREATE_DATE)
values (p_rec_sl.DEALER_CODE, p_rec_sl.MPCI_CREATE_DATE);
end if;
--
select count(*) into l_counter
from dual
where exists(select NULL
FROM WAR_CLAIM
WHERE CLAIM_NO = p_rec_sl.CLAIM_NO);
if l_counter = 0
then
g_nCntMasterCLAIM := g_nCntMasterCLAIM + 1;
--
insert into WAR_CLAIM(CLAIM_NO, MPCI_CREATE_DATE)
values (p_rec_sl.CLAIM_NO, p_rec_sl.MPCI_CREATE_DATE);
end if;
--
. . .


Primer 2


I na kraju, pošto nedostatak master redova i nije baš "skroz regularna" situacija i može da nastane zbog nekog problema, zgodno je odbrojati da li je i koliko master redova nedostajalo i kroz odgovarajući GUI interface portal/software prijaviti to korisniku.

 

VRH STRANE

(c) 2003 OMEGA - sva prava zadržana