我正在尝试从all_tab_partitions表中获取当前分区的名称。当我尝试比较high_value (长数据类型)和数字时。它抛出一个错误:
ORA-00997:非法使用长数据类型
SELECT PARTITION_NAME, HIGH_VALUE FROM ALL_TAB_PARTITIONS
WHERE TABLE_OWNER='SCHEMA_NAM'
AND TABLE_NAME='TABLE_NAME'
AND HIGH_VALUE>to_number(TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE, 1), 'MONTH'), 'YYYYDDD'))
/发布于 2012-04-24 21:03:39
长类型存储大变量长字符串,它不是数字类型。它有许多局限性。Oracle文档说:
长值的使用受以下限制:
表只能包含一个长列。不能创建具有长attribute.
。
发布于 2012-04-25 11:45:06
为了检查或使用长列的值,您必须编写一些PL/SQL,类似于
DECLARE
strHigh_value VARCHAR2(4000);
BEGIN
FOR aRow IN (SELECT PARTITION_NAME, HIGH_VALUE
FROM ALL_TAB_PARTITIONS
WHERE TABLE_OWNER = 'SCHEMA_NAM' AND
TABLE_NAME = 'TABLE_NAME')
LOOP
strHigh_value := aRow.HIGH_VALUE;
-- TODO: Manipulate strHigh_value in whatever manner you need
END LOOP;
END;分享并享受。
发布于 2017-08-31 18:42:53
如果您不想编写任何PL/SQL,请尝试使用(通常情况下):
select
sys.dbms_metadata_util.long2varchar(4000, 'TABLE_NAME', 'COLUMN_NAME', tp.rowid) as COLUMN_NAME
from
TABLE_NAME tp
where
<your_condition on table TABLE_NAME>不要在...your_condition中使用TABLE_NAME.
在您的例子中,由于您查询了一个视图,所以它更复杂一些。有必要挖掘视图代码并将查询重写为:
select PARTITION_NAME, HIGH_VALUE from (
select t.PARTITION_NAME, sys.dbms_metadata_util.long2varchar(4000, 'SYS.TABCOMPART$', 'HIBOUNDVAL', tp.rowid) as high_value
from
all_tab_partitions t, sys.obj$ o, sys.tabcompart$ tp
where
t.table_name = 'TABLE_NAME'
and t.table_owner = 'SCHEMA_NAM'
and o.name = t.table_name
and o.subname = t.partition_name
and o.obj# = tp.obj#(+)
)
where
high_value > to_number(TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE, 1), 'MONTH'), 'YYYYDDD'))在Oracle 11g上测试
https://stackoverflow.com/questions/10304218
复制相似问题