-- verificare_vfacturi.sql -- Compara valoare calculata (FACT_VFACTURI) cu valoare denormalizata (FACT_VFACTURI2) -- pentru fiecare coloana comuna, pe toate facturile din schema curenta. -- Testul de regresie al planului #8 (docs\plan_08_denormalizare_vanzari.md). -- -- Rulare (schema de dezvoltare, conform COMUN\docs\scripturi-migrare-db.md): -- & 'D:\ROA\instantclient_19_18\sqlplus.exe' -L -S 'MARIUSM_AUTO/@ROA_CENTRAL' '@verificare_vfacturi.sql' -- -- Rezultatul: o linie per coloana cu diferente, in ordinea descrescatoare a numarului de facturi. -- Coloanele identice nu se afiseaza. set serveroutput on size unlimited set linesize 200 pagesize 0 feedback off heading off verify off declare lcSel clob := 'select '; lcCol varchar2(30); lnPrim number := 1; lcRez varchar2(32767); type t_nume is table of varchar2(30); laNume t_nume := t_nume(); begin for c in (select c.column_name from all_tab_columns c where c.owner = user and c.table_name = 'FACT_VFACTURI' and c.data_type in ('NUMBER','VARCHAR2','CHAR','DATE') and c.column_name <> 'ID_VANZARE' and exists (select 1 from all_tab_columns d where d.owner = c.owner and d.table_name = 'FACT_VFACTURI2' and d.column_name = c.column_name) order by c.column_id) loop lcCol := c.column_name; laNume.extend; laNume(laNume.count) := lcCol; if lnPrim = 0 then lcSel := lcSel || q'[||','||]'; end if; -- decode trateaza NULL = NULL ca egalitate lcSel := lcSel || 'sum(decode(a.'||lcCol||',b.'||lcCol||',0,1))'; lnPrim := 0; end loop; lcSel := lcSel || ' from fact_vfacturi a join fact_vfacturi2 b on a.id_vanzare = b.id_vanzare'; execute immediate lcSel into lcRez; dbms_output.put_line('--- coloane cu diferente intre FACT_VFACTURI (calculat) si FACT_VFACTURI2 (denormalizat) ---'); declare lnPoz number := 1; lnVirg number; lcVal varchar2(50); lnTotal number := 0; begin for i in 1 .. laNume.count loop lnVirg := instr(lcRez, ',', lnPoz); if lnVirg = 0 then lcVal := substr(lcRez, lnPoz); else lcVal := substr(lcRez, lnPoz, lnVirg - lnPoz); lnPoz := lnVirg + 1; end if; if to_number(lcVal) > 0 then dbms_output.put_line(lpad(lcVal, 8) || ' ' || laNume(i)); lnTotal := lnTotal + 1; end if; end loop; dbms_output.put_line('--- ' || lnTotal || ' coloane diferite din ' || laNume.count || ' comparate ---'); end; end; / select '--- perechi comparate: ' || count(*) || ' ---' from fact_vfacturi a join fact_vfacturi2 b on a.id_vanzare = b.id_vanzare; exit