Как удалить оракул раздел с именем раздела в качестве сгенерированного параметра
Я должен удалить разделы, которые старше 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 ответ
Решение
Имя раздела должно быть исправлено во время выполнения оператора 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;