我被要求在某个日期之前找到一个表的所有分区,脚本将每天重新运行并删除60天前创建的所有分区。我已经想出了这个脚本,它试图找到要删除的分区的数量,并将其保存在属性表中供以后使用。
DECLARE
numero_di_partizioni NUMBER;
BEGIN
SELECT COUNT(*) INTO numero_di_partizioni
FROM ALL_TAB_PARTITIONS
WHERE TABLE_NAME = 'CA_LG_SATELLITI_IMEL'
AND PARTITION_NAME LIKE 'SYS%'
AND TO_DATE(SUBSTR(HIGH_VALUE, INSTR(HIGH_VALUE, '''')+2, 19), 'YYYY-MM-DD HH24:MI:SS') < sysdate - 60 ;
BEGIN
INSERT INTO IML_PA_PROPERTY (PR_KEY, PR_VALUE)
VALUES ('DROP_PART_TO_CA_LG_SATELLITI_IMEL', numero_di_partizioni);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
UPDATE IML_PA_PROPERTY
SET PR_VALUE = numero_di_partizioni
WHERE PR_KEY = 'DROP_PART_TO_CA_LG_SATELLITI_IMEL';
END;
END;
/
字符串
该表存在并且几乎是空的,所以它在60天前没有分区。
这个脚本继续给予我一个错误 * unconsistent data types expected char got long*。正是这个错误是在第一个查询,我也试图转换为长,但不建议,我没有实现这一点。
1条答案
按热度按时间iugsix8n1#
*_TAB_PARTITIONS.HIGH_VALUE
是一个长整型,使用起来极其困难。在SQL中,您无法对其执行任何操作。幸运的是,PL/SQL有一个内置的功能,只需通过赋值就可以将其转换为varchar 2。字符串
这将适用于单个日期列上的范围分区表。如果您有
LIST
分区,或者数据类型不是日期,或者分区键是多个列,那么所有这些都可以得到支持,但是需要更多的编码来解决每种情况,并确保您分配给正确类型的变量。