Главная > SQL > Oracle Создание PARTITION BY RANGE по полю DATE


Oracle Создание PARTITION BY RANGE по полю DATE

Скрипт помогающий создать PARTITION BY RANGE по полю DATE

SET LINESIZE 150
SET SERVEROUTPUT ON SIZE 1000000
WHENEVER SQLERROR CONTINUE
SPOOL C:\create_partition_date.log
declare
 iter number;
 l_date_start date := to_date('01-11-2011','dd-mm-yyyy');
 l_date_end   date := to_date('01-01-2023','dd-mm-yyyy');
 l_name_part  varchar2(20) := 'TEST';
 l_part_field varchar2(20) := 'MY_DATE';
begin
 dbms_output.put_line('PARTITION BY RANGE('||l_part_field||')');
 dbms_output.put_line('(');
 dbms_output.put_line(' PARTITION '||l_name_part
                        ||'_MIN     VALUES LESS THAN (to_date('''
                        ||to_char(add_months(l_date_start,-1),'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 for j in (
              with t as (
              select l_date_start d1,
                     l_date_end d2
              from dual
            )
            --
            select decode(level,1,d1,
                          trunc(add_months(d1,level-1),'mm')
                         ) as date_from
            from t
            connect by add_months(trunc(d1,'mm'),level-1) <= d2
           ) 
 loop
   dbms_output.put_line(',PARTITION '||l_name_part||'_'
                        ||to_char(add_months(j.date_from,-1),'mm_yyyy')
                        ||' VALUES LESS THAN (to_date('''
                        ||to_char(j.date_from,'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 end loop;
 dbms_output.put_line(',PARTITION '||l_name_part
                      ||'_MAX     VALUES LESS THAN (MAXVALUE)'); 
 dbms_output.put_line(')');
end;
/
spool off

PARTITION BY RANGE(MY_DATE)
(
 PARTITION TEST_MIN     VALUES LESS THAN (to_date('01-10-2011','dd-mm-yyyy'))
,PARTITION TEST_10_2011 VALUES LESS THAN (to_date('01-11-2011','dd-mm-yyyy'))
,PARTITION TEST_11_2011 VALUES LESS THAN (to_date('01-12-2011','dd-mm-yyyy'))
...
,PARTITION TEST_11_2022 VALUES LESS THAN (to_date('01-12-2022','dd-mm-yyyy'))
,PARTITION TEST_12_2022 VALUES LESS THAN (to_date('01-01-2023','dd-mm-yyyy'))
,PARTITION TEST_MAX     VALUES LESS THAN (MAXVALUE)
)
 
PL/SQL procedure successfully completed
SQL> spool off
Stopped spooling to C:\create_partition_date.log

Похожие записи:

  1. Fel_X
    1 Июль 2013 в 11:34 | #1

    Не совсем понятно. Хотелось бы пример использования и результат.
    А то мне мыслится так:

    WITH ttt AS (SELECT 3 ss, TO_DATE(‘03.05.1977’, ‘dd.mm.yyyy’) dd FROM DUAL
    UNION ALL
    SELECT 3 ss, TO_DATE(‘21.04.1977’, ‘dd.mm.yyyy’) dd FROM DUAL
    UNION ALL
    SELECT 2 ss, TO_DATE(‘11.01.1976’, ‘dd.mm.yyyy’) dd FROM DUAL
    UNION ALL
    SELECT 1 ss, TO_DATE(‘14.11.1976’, ‘dd.mm.yyyy’) dd FROM DUAL
    UNION ALL
    SELECT 1 ss, TO_DATE(‘21.05.1977’, ‘dd.mm.yyyy’) dd FROM DUAL)
    select ttt.*,
    TRUNC(dd,’Y’) gg,
    sum(ss) over (partition by TRUNC(dd,’Y’)) poGod,
    TRUNC(dd,’MM’) mm,
    sum(ss) over (partition by TRUNC(dd,’MM’)) poMes
    from ttt

  1. Пока что нет уведомлений.