#oracle #plsql #oracle-sqldeveloper #plsqldeveloper #plsql-package
#Oracle #plsql #oracle-sqldeveloper #plsqldeveloper #plsql-пакет
Вопрос:
У меня есть таблица, в которой есть разделы и подразделы. Я должен сначала отфильтровать результаты для High_Value раздела (TO_DATE(‘ 2020-03-29 00:00:00’, ‘ SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR= GREGORIAN’)) с меньшим, чем некоторое значение даты, а затем в результирующем наборе отфильтруйте значение подраздела High с некоторым текстовым значением и, если условие удовлетворяет, удалите этот раздел. Я написал код, указанный ниже, но не уверен, как действовать дальше. Может кто-нибудь, пожалуйста, помочь в том, как объявить d_tmp, а затем выполнить цикл по каждому подразделу и проверить
DECLARE
CURSOR get_parts IS
select partition_name, high_value
from ALL_TAB_PARTITIONS
where table_name = 'TempTable';
l_tmp LONG;
d_tmp DATE;
BEGIN
FOR part_rec IN get_parts
LOOP
l_tmp := part_rec.high_value;
EXECUTE IMMEDIATE 'SELECT ' || SUBSTR(l_tmp, 1, 90) || ' FROM DUAL' INTO d_tmp;
DBMS_OUTPUT.PUT_LINE( to_char(d_tmp, 'DD-MM-YYYY'));
END LOOP;
END;
Ответ №1:
Вы прошли большую часть пути. Вы просто перебираете подразделы для этого раздела
DECLARE
CURSOR get_parts IS
select partition_name, high_value
from ALL_TAB_PARTITIONS
where table_name = 'TEMPTABLE';
l_tmp LONG;
d_tmp DATE;
l_tmp2 LONG;
BEGIN
FOR part_rec IN get_parts
LOOP
l_tmp := part_rec.high_value;
EXECUTE IMMEDIATE 'SELECT ' || SUBSTR(l_tmp, 1, 90) || ' FROM DUAL' INTO d_tmp;
DBMS_OUTPUT.PUT_LINE( to_char(d_tmp, 'DD-MM-YYYY'));
for i in (
select subpartition_name, high_value
from ALL_TAB_SUBPARTITIONS
where table_name = 'TEMPTABLE'
and partition_name = get_parts.partition_name
)
loop
l_tmp2 := i.high_value;
--
-- your checks
--
if [checks passed] then
execute immediate 'alter table TEMPTABLE drop subpartition '||i.subpartition_name;
end loop;
END LOOP;
END;