Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何编写一个过程来删除所有超过12个月的分区?_Oracle - Fatal编程技术网

Oracle 如何编写一个过程来删除所有超过12个月的分区?

Oracle 如何编写一个过程来删除所有超过12个月的分区?,oracle,Oracle,我有一个基于日期字段的分区表。现在,我必须编写一个过程来删除所有超过12个月的分区 我在user\u tab\u partitions表中有以下格式的条目 PARTITION_NAME HIGH_VALUE -------------- ---------- SYS_P28468650 20161221 SYS_P28468649 20161220 SYS_P28468648 20161219 SYS_P28468647 201

我有一个基于日期字段的分区表。现在,我必须编写一个过程来删除所有超过12个月的分区

我在user\u tab\u partitions表中有以下格式的条目

PARTITION_NAME      HIGH_VALUE
--------------      ----------
SYS_P28468650       20161221
SYS_P28468649       20161220
SYS_P28468648       20161219
SYS_P28468647       20161218

请帮助我做这件事

看起来分区是基于数字的,而不是日期值

无论如何,像这样的程序应该是可行的:

DECLARE

    HighValue NUMBER;

    CURSOR TabPartitions IS
    SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
    FROM USER_TAB_PARTITIONS 
    WHERE TABLE_NAME = 'YOUR_TABLE'
    ORDER BY TABLE_NAME, PARTITION_POSITION;

BEGIN

    FOR aPart IN TabPartitions LOOP
        EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT HighValue;
        IF TO_DATE(HighValue, 'YYYYMMDD') < ADD_MONTHS(SYSDATE, -12) THEN
            EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE DROP PARTITION '||aPart.PARTITION_NAME||' UPDATE GLOBAL INDEXES';
        END IF;     
    END LOOP;

END;

感谢第1行ORA-01847的rply错误:月日必须介于1和月的最后一天之间ORA-06512:在“系统标准”中,第167行ORA-06512:在第11Is行中是否正在工作?如果不是,分区键的数据类型是什么?根据您的示例,它似乎是
NUMBER
。它是
日期
还是
时间戳
?分区键是数字(38)数据类型,并采用以下YYYYMMDD格式。
EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE DROP PARTITION FOR ('||aPart.PARTITION_NAME||') UPDATE GLOBAL INDEXES';