как удалить оракул раздел с именем раздела в качестве сгенерированного параметра - PullRequest
2 голосов
/ 23 июня 2011

я должен удалить разделы, которые старше 364 дней.Разделы называются «log_20110101», поэтому теперь разделы, которые старше, чем сегодня, должны быть

CONCAT('log_',TO_CHAR(SYSDATE -364,'YYYYMMDD'))

, если я попробую такое утверждение, я получу ошибку

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

-

Error report:
SQL Error: ORA-14048: a partition maintenance operation may not be combined with other operations
14048. 00000 -  "a partition maintenance operation may not be combined with other operations"
*Cause:    ALTER TABLE or ALTER INDEX statement attempted to combine
           a partition maintenance operation (e.g. MOVE PARTITION) with some
           other operation (e.g. ADD PARTITION or PCTFREE which is illegal
*Action:   Ensure that a partition maintenance operation is the sole
           operation specified in ALTER TABLE or ALTER INDEX statement;
           operations other than those dealing with partitions,
           default attributes of partitioned tables/indices or
           specifying that a table be renamed (ALTER TABLE RENAME) may be
           combined at will

1 Ответ

5 голосов
/ 23 июня 2011

Имя раздела должно быть исправлено во время выполнения оператора SQL, оно не может быть выражением. Вы должны быть в состоянии сделать что-то вроде этого, когда вы перебираете таблицу USER_TAB_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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...