删除 Oracle 中 table 的一年旧分区

DROP an one year old partition of a table in Oracle

我不得不删除 table 一岁的分区。现在,在 all_tab_partitions 中, HIGH_VALUE 列是 LONG 数据类型,而我的 table 在 RANGE (date column) 上分区。因此,我不得不想出一种方法来阅读本专栏,然后确定该分区是否存在一年。我能够从某处获取以下脚本并按照我的 requirement.However 使用它,但我无法理解它的作用。请帮助我理解这段代码:

WITH xml AS (
           SELECT XMLTYPE(
                     DBMS_XMLGEN.GETXML('select partition_name,table_name,table_owner,high_value from all_tab_partitions where table_owner=''VOYAGER''
                      ')
                    ) AS xml
            FROM   dual
            )
   ,    parsed_xml 
        AS (SELECT EXTRACTVALUE (xs.object_value, '/ROW/TABLE_NAME')
                      AS table_name,
                   EXTRACTVALUE (xs.object_value, '/ROW/HIGH_VALUE')
                      AS high_value,
                   EXTRACTVALUE (xs.object_value, '/ROW/PARTITION_NAME')
                      AS partition_name,
                   EXTRACTVALUE (xs.object_value, '/ROW/TABLE_OWNER')
                      AS table_owner
              FROM xml x,
                   TABLE (XMLSEQUENCE (EXTRACT (x.xml, '/ROWSET/ROW'))) xs)
   SELECT PARTITION_NAME ,table_owner , table_name 
     FROM parsed_xml
    WHERE   --  TABLE_OWNER = 'VOYAGER' 
             TRUNC (SYSDATE)
              - TO_DATE (SUBSTR (HIGH_VALUE, 11, 10), 'YYYY-MM-DD') >= 365;

all_tab_partitions 中的 high_value 的数据类型为 long,使用起来很麻烦。

这里的第一个 CTE 是使用 dbms_xmlgen 包来获取 table 中数据的 XML 表示,这意味着长列被隐式转换为普通文本节点值。

第二个 CTE 然后使用 XML 操作,包括已弃用的 extractvalue 函数,将 XML 转换回关系形式;本质上是给你一个 'table',table_ownertable_namepartition_name 以及 high_value 现在作为 varchar2 值而不是long.

最后,关系数据可用于比较高值 - 您现在可以轻松地将其作为字符串引用,并在 substr 等函数中使用,而您无法使用原始 long 值 - 当前日期。

顺便说一下,由于并非所有年份都有 365 天,您可以通过以下方式回顾 12 个月:

WHERE TO_DATE (SUBSTR (HIGH_VALUE, 11, 10), 'YYYY-MM-DD')
  < ADD_MONTHS(TRUNC(SYSDATE), -12);