2013-09-10 3 views
0

Oracle: 11.2.0.2 Я пытаюсь удалить месячные и ежедневные разделы с использованием сценария. Это отлично работает для ежемесячных разделов, но не для ежедневных разделов. Ниже приведена ошибка, которую я вижу в журнале. День месяца становится нулевым при расчете.Неправильный расчет для ежедневных разделов

2013-08-0|SYS_P328538|2|YES 
DECLARE 
* 
ERROR at line 1: 
ORA-01847: day of month must be between 1 and last day of month 
ORA-06512: at line 43 

Ниже приведен сценарий. Я думаю, что дата highvalue просчитана.

SQL> DECLARE 
2  CURSOR tab_part_cur IS 
3   select PARTITION_POSITION, PARTITION_NAME,HIGH_VALUE,INTERVAL from dba_tab_partitions where table_name = 'MO_USAGEDATA' 
and table_owner = 'WSMUSER17' 
order by PARTITION_POSITION; 
4  tab_part_rec tab_part_cur%ROWTYPE; 
5  lHighValue LONG; 
6  strPartitionLessThanDate VARCHAR2(100); 
7  dtTestDate DATE; 
8  DaysInPast NUMBER; 
9  SQLstr varchar2(100); 
10  strIntervalType varchar2(1000); 
11  strRunType varchar2(20); 
12 BEGIN 
13  strRunType := 'DRY_RUN'; 
14  select INTERVAL into strIntervalType from dba_part_tables where table_name ='MO_USAGEDATA' and owner = 'WSMUSER17'; 
15  strIntervalType := REGEXP_SUBSTR(strIntervalType, '''[^'']+'''); 
16  DBMS_OUTPUT.PUT_LINE(strIntervalType); 
17   CASE 
18   WHEN strIntervalType = '''DAY''' THEN 
19    DBMS_OUTPUT.PUT_LINE('Interval type = '||strIntervalType); 
20 --   dtTestDate := CURRENT_DATE - 7 - 1; Offset adjustment if necessary 
21    dtTestDate := CURRENT_DATE - 7; 
22    DBMS_OUTPUT.PUT_LINE('Test Date = '||dtTestDate); 
23   WHEN strIntervalType = '''MONTH''' THEN 
24    DBMS_OUTPUT.PUT_LINE('Interval type = '||strIntervalType); 
25 --    dtTestDate := CURRENT_DATE - 90; 
26     dtTestDate := ADD_MONTHS(current_date,- 7); 
27    DBMS_OUTPUT.PUT_LINE('TestDate = '||dtTestDate); 
28   ELSE 
29    DBMS_OUTPUT.PUT_LINE('Unexpected interval, exiting.'); 
30    GOTO EXIT; 
31  END CASE; 
32  OPEN tab_part_cur; 
33  LOOP 
34   FETCH tab_part_cur INTO tab_part_rec; 
35   EXIT WHEN tab_part_cur%NOTFOUND; 
36   DBMS_OUTPUT.PUT_LINE(tab_part_cur%ROWCOUNT); 
37   lHighValue := tab_part_rec.high_value; 
38   /* This next line seems redundant but is needed for conversion quirk from LONG to VARCHAR2 
39   */ 
40   strPartitionLessThanDate := lHighValue; 
41   strPartitionLessThanDate := substr(strPartitionLessThanDate, 11, 10); 
42 DBMS_OUTPUT.PUT_LINE(strPartitionLessThanDate ||'|'|| tab_part_rec.partition_name ||'|'|| tab_part_rec.partition_position ||'|'|| tab_part_rec.interval); 
43 DBMS_OUTPUT.PUT_LINE(TO_DATE(strPartitionLessThanDate, 'YYYY-MM-DD') ||'******'||dtTestDate); 
44 IF TO_DATE(strPartitionLessThanDate, 'YYYY-MM-DD') < dtTestDate AND tab_part_rec.partition_name <> 'PART_MINVALUE 
' THEN 
45 SQLstr := 'ALTER TABLE WSMUSER17.MO_USAGEDATA DROP PARTITION '||tab_part_rec.partition_name ||' update Global indexes'; 
46    DBMS_OUTPUT.PUT_LINE('Targeted Partition !!!!!!!!'); 
47    IF strRunType = 'LIVE_RUN' THEN 
48     DBMS_OUTPUT.PUT_LINE('Dropping Partition !!!!!!!!'); 
49    execute immediate SQLstr; 
50    END IF; 
51   END IF; 
52  END LOOP; 
53  CLOSE tab_part_cur; 
54  <<EXIT>> 
55  DBMS_OUTPUT.PUT_LINE('Partition purge complete'); 
56 END; 
57/
'DAY' 
Interval type = 'DAY' 
Test Date = 03-SEP-13 
1 
2012-06-1|PART_MINVALUE|1|NO 
01-JUN-12******03-SEP-13 
2 
2013-08-0|SYS_P328538|2|YES 
DECLARE 
* 
ERROR at line 1: 
ORA-01847: day of month must be between 1 and last day of month 
ORA-06512: at line 43 

Я пытаюсь сохранить lat 7 разделов в ежедневной разбитой таблице и отбросить остальные разделы. Но это не отбрасывает их.

+0

Я не могу воспроизвести, вы можете опубликовать ** минимальное ** выражение 'CREATE table', которое создает такое поведение. минимальный = не более одного столбца, два раздела –

+0

CREATE TABLE "TEST". "MO_USAGEDATA" ("USGEDATAID" NUMBER (38,0) NOT NULL ENABLE, "REQUSERNAME" VARCHAR2 (128 CHAR), "ЗАПРОСИТЬ" TIMESTAMP (9) NOT NULL ВКЛЮЧИТЬ, "REQUESTMILLIS" НОМЕР (38,0) NOT NULL ВКЛЮЧИТЬ, "СпециальноеПоле1" VARCHAR2 (256 СИМ), НОМЕР "NMREQMSGSIZE" (38,0), НОМЕР "NMRESPMSGSIZE" (38,0), "OTHERUSERNAMES" VARCHAR2 (512 СИМ)) \t разбиение по диапазону ("REQUESTDTS") ИНТЕРВАЛ (NUMTODSINTERVAL (1, 'день')) значения \t (раздел PART_MINVALUE меньше, чем (TIMESTAMP «2012-06-18 00:00:00 ')) TABLESPACE "TEST1"; – user1968156

+0

Мне пришлось удалить некоторые столбцы из-за ограничения пространства, но секционированный столбец, requestdts есть. – user1968156

ответ

3

Хорошо, я создал таблицу, вставить некоторые данные и побежал некоторые из ваших запросов и у вас есть что-то не так с вашей подстроки:

SQL> CREATE TABLE "MO_USAGEDATA" (
    2 "REQUESTDTS" TIMESTAMP (9) NOT NULL ENABLE 
    3 ) 
    4 partition by range ("REQUESTDTS") INTERVAL(NUMTODSINTERVAL(1,'DAY')) 
    5 (partition PART_MINVALUE values less than(TIMESTAMP '2012-06-18 00:00:00')); 

Table created 

SQL> INSERT INTO MO_USAGEDATA 
    2  (SELECT SYSDATE + ROWNUM FROM dual CONNECT BY LEVEL <= 30); 

30 rows inserted 

SQL> SELECT high_value, INTERVAL 
    2 FROM all_tab_partitions 
    3 WHERE table_name = 'MO_USAGEDATA' 
    4  AND table_owner = USER 
    5 ORDER BY PARTITION_POSITION; 

HIGH_VALUE       INTERVAL 
------------------------------------ --------- 
[...] 
TIMESTAMP' 2013-09-30 00:00:00'  YES 
TIMESTAMP' 2013-10-01 00:00:00'  YES 
TIMESTAMP' 2013-10-02 00:00:00'  YES 
[...] 

SQL> SELECT substr('TIMESTAMP'' 2013-10-02 00:00:00''', 11, 10) FROM dual; 

SUBSTR('TIMESTAMP''2013-10-020 
------------------------------ 
2013-10-0 

Как вы можете видеть, вы с одним персонажем. Он работает с столбцами DATE, но для разбиения на разделы TIMESTAMP вам необходимо настроить смещение.

+0

Спасибо, Винсент, я изменил его, и теперь он отлично работает. – user1968156

Смежные вопросы