CREATE OR REPLACE PROCEDURE crea_partizione
( p_data_partizione  date default sysdate,
  p_nome_tabella          varchar2,
  p_path_file_log         varchar2
) IS
  -- la procedura prende in ingresso la data di storicizzazione
  -- e imposta la data limite della nuova partizione aggiungendo 3 mesi a quella in ingresso

  v_data_part           varchar2(100);
  v_nome_part           varchar2(100);
  s_partition_name_max  varchar2(100);
  puntatore_file_log    UTL_FILE.FILE_TYPE;
  v_anno               number;

BEGIN

  
  v_data_part := to_char(p_data_partizione,' yyyy-mm-dd hh24:mi:ss');
  -- impostazione del nome della partizione con il seguente formato:
  -- yyyy_q anno (yyyy anno corrente - q trimestre di riferimento della partizione)
  v_nome_part := 'T'||to_char(trunc(p_data_partizione,'mm')-1,'q');
  if v_nome_part = 'T4' then
    v_anno := to_number(to_char(p_data_partizione,'yyyy'))-1;
    v_nome_part := v_nome_part||'_'||v_anno;
  else
    v_nome_part := v_nome_part||to_char(p_data_partizione, '_yyyy');
  end if;

  puntatore_file_log := UTL_FILE.FOPEN(p_path_file_log,'crea_partizione_'||p_nome_tabella||'_'||to_char(sysdate, 'ddmmyyyy_hh24miss')||'.log','a');

  UTL_FILE.PUT_LINE(puntatore_file_log, to_char(sysdate, 'dd/mm/yyyy hh24:mi:ss')||' Inizio Procedura crea_partizione per la tabella '||p_nome_tabella);
  
  select a.partition_name
  into s_partition_name_max
  FROM all_tab_partitions a
  where a.table_name = upper(p_nome_tabella)
    and a.partition_position =
      ( select max(partition_position)
        from all_tab_partitions
        where table_name = upper(p_nome_tabella));

  execute immediate('ALTER TABLE '|| p_nome_tabella ||'
    SPLIT PARTITION ' || s_partition_name_max || ' AT (TO_DATE('''||v_data_part||''', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN''))
    INTO (PARTITION ' || v_nome_part ||',
          PARTITION ' ||s_partition_name_max||')');

  UTL_FILE.PUT_LINE(puntatore_file_log, 'Creata partizione '||v_nome_part);
  
  UTL_FILE.PUT_LINE(puntatore_file_log, to_char(sysdate, 'dd/mm/yyyy hh24:mi:ss')||' Fine Procedura crea_partizione per la tabella '||v_nome_part);
  
  UTL_FILE.FCLOSE(puntatore_file_log);

EXCEPTION WHEN OTHERS  THEN
  raise;      
END;
/