删除 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_owner
、table_name
和 partition_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);
我不得不删除 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_owner
、table_name
和 partition_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);