/*=================================================================================================
AUTORE     : Almaviva
DATA       : 9 Gennaio 2018
VERSIONE   : 1
OBIETTIVO  :
DESCRIZIONE: Bonifica codici isola
=================================================================================================*/
SET SERVEROUTPUT ON
SET VERIFY OFF
SET LINESIZE 255

DECLARE
  ROUTINE VARCHAR2(50) := 'BONIFICA_CODICI_ISOLA';

  codiIdOpr varchar2(100) := '&codiIdOpr'; 
  lastCode varchar2(100);
  startNum number;
  codiCuaa varchar2(100);
  cnt1 PLS_INTEGER := 0; cnt2 PLS_INTEGER := 0;

  cursor cPcg
  is
  SELECT /*+ PARALLEL(A,8)*/ ID_PCG_VERS, COUNT(*) CNT
  FROM AABGISOL_VERS_TAB A
  WHERE TRIM(CODI_ISOL) IS NULL
  GROUP BY ID_PCG_VERS;

  cursor cIsol(codiCuaa varchar2, idPcgCons number, startNum number)
  is
  select ID_ISOL,
      codiIdOpr||'/'||codiCuaa||'/'||AABGAD_UTL.converNumberToLPISCode(startnum + rownum) as CODI_ISOL
  from AABGISOL_VERS_TAB
  where ID_PCG_VERS = idPcgCons
  and TRIM(CODI_ISOL) IS NULL
  order by ID_ISOL
  for update;

BEGIN
  DBMS_OUTPUT.ENABLE(1000000);
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MM-YYYY, HH24:MI:SS')||' - Inizio esecuzione '||ROUTINE);

  --1. AGGIORNAMENTO CODI_ISOL DA AABGISOL_TAB (ISOLE CONSOLIDATE)
  DBMS_OUTPUT.PUT_LINE('1. Aggiornamento codici isola da AABGISOL_TAB:');

  UPDATE /*+ PARALLEL(A,8)*/ AABGISOL_VERS_TAB A
  SET A.CODI_ISOL = (SELECT B.CODI_ISOL FROM AABGISOL_TAB B WHERE B.ID_ISOL = A.ID_ISOL AND B.CLAS_ISOL = 3)
  WHERE TRIM(CODI_ISOL) IS NULL
  AND EXISTS(SELECT B.CODI_ISOL FROM AABGISOL_TAB B WHERE B.ID_ISOL = A.ID_ISOL AND B.CLAS_ISOL = 3);

  DBMS_OUTPUT.PUT_LINE(' - numero di isole aggiornate: '||SQL%ROWCOUNT);

  COMMIT;

  DBMS_OUTPUT.PUT_LINE('---');
  DBMS_OUTPUT.PUT_LINE('2. Calcolo nuovi codici isola:');
  for rPcg in cPcg loop
    BEGIN
      cnt1 := 0;

      SELECT DISTINCT CUAA
      INTO codiCuaa
      FROM AABGFGRA_TAB F
      JOIN AABGSCHE_VALI_TAB P USING (ID_FGRA)
      WHERE ID_PCG_VERS = rPcg.ID_PCG_VERS;
      DBMS_OUTPUT.PUT_LINE(' - CUAA: '||codiCuaa||'; ID_PCG_VERS: '||rPcg.ID_PCG_VERS
                           ||'; Numero di isole da aggiornare: '||rPcg.CNT);

      
      select max(regexp_substr(CODI_ISOL, '[A-Z]{3}[0-9]{2}$'))
      into lastCode
      from AABGISOL_VERS_TAB
      where ID_PCG_VERS = rPcg.ID_PCG_VERS
      and TRIM(CODI_ISOL) IS NOT NULL;

      if (lastCode is null) then
          startNum := 0;
      else
          declare
              valStr varchar2(100);
              valNum varchar2(100);
          begin
              valStr := substr(lastCode, 1, 3);
              valNum := substr(lastCode, 4);
              startNum := AABGAD_UTL.convertBase26toNumber(valStr)*100 + to_number(valNum);
          end;
      end if;

      for rIsol in cIsol(codiCuaa, rPcg.ID_PCG_VERS, startNum) loop
        update AABGISOL_VERS_TAB
        set CODI_ISOL = rIsol.CODI_ISOL
        where current of cIsol;
        
        cnt1 := cnt1 + SQL%ROWCOUNT;
      end loop;
      DBMS_OUTPUT.PUT_LINE('   numero di isole aggiornate: '||cnt1);
      COMMIT;

      cnt2 := cnt2 + cnt1;

    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MM-YYYY, HH24:MI:SS')||' - ERRORE: '||SQLERRM||CHR(13)||CHR(10)||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    END;

  end loop;
  DBMS_OUTPUT.PUT_LINE(' - numero totale di isole aggiornate: '||cnt2);

  DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MM-YYYY, HH24:MI:SS')||' - Fine esecuzione '||ROUTINE);

EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,'DD-MM-YYYY, HH24:MI:SS')||' - ERRORE: '||SQLERRM||CHR(13)||CHR(10)||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;

