Oracle10g 如何删除以分区名称作为生成参数的oracle分区

Oracle10g 如何删除以分区名称作为生成参数的oracle分区,oracle10g,database-partitioning,Oracle10g,Database Partitioning,我必须删除超过364天的分区。 分区命名为log_20110101,因此比 今天必须是 CONCAT'log',TO_CHARSYSDATE-364,'yyyyymmdd' 现在,如果我尝试这样的陈述,我会得到错误 ALTER TABLE LOG DROP PARTITION CONCAT('log_',TO_CHAR(SYSDATE -364,'YYYYMMDD')); - 在发出SQL语句时需要固定分区名称,它不能是表达式。您应该能够执行类似的操作,遍历USER\u TAB\u PARTI

我必须删除超过364天的分区。 分区命名为log_20110101,因此比 今天必须是

CONCAT'log',TO_CHARSYSDATE-364,'yyyyymmdd'

现在,如果我尝试这样的陈述,我会得到错误

ALTER TABLE LOG
DROP PARTITION CONCAT('log_',TO_CHAR(SYSDATE -364,'YYYYMMDD'));
-


在发出SQL语句时需要固定分区名称,它不能是表达式。您应该能够执行类似的操作,遍历USER\u TAB\u PARTITIONS表,确定要删除哪些分区,并构造动态SQL来实际删除它们

DECLARE
  l_sql_stmt VARCHAR2(1000);
  l_date     DATE;
BEGIN
  FOR x IN (SELECT * 
              FROM user_tab_partitions
             WHERE table_name = 'LOG')
  LOOP
    l_date := to_date( substr( x.partition_name, 5 ), 'YYYYMMDD' );
    IF( l_date < add_months( trunc(sysdate), -12 ) )
    THEN
      l_sql_stmt := 'ALTER TABLE log ' ||
                    ' DROP PARTITION ' || x.partition_name;
      dbms_output.put_line( l_sql_stmt );
      EXECUTE IMMEDIATE l_sql_stmt;
    END IF;
  END LOOP;
END;
DECLARE
  l_sql_stmt VARCHAR2(1000);
  l_date     DATE;
BEGIN
  FOR x IN (SELECT * 
              FROM user_tab_partitions
             WHERE table_name = 'LOG')
  LOOP
    l_date := to_date( substr( x.partition_name, 5 ), 'YYYYMMDD' );
    IF( l_date < add_months( trunc(sysdate), -12 ) )
    THEN
      l_sql_stmt := 'ALTER TABLE log ' ||
                    ' DROP PARTITION ' || x.partition_name;
      dbms_output.put_line( l_sql_stmt );
      EXECUTE IMMEDIATE l_sql_stmt;
    END IF;
  END LOOP;
END;