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; /