Как написать сценарий выбора plSQL, отфильтровав значение в разделе, а затем подраздел

#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;