2012-04-24 31 views
2

我想从all_tab_partitions表中获取当前分区的名称。当我尝试比较high_value(长数据类型)和数量。它抛出一个错误:oracle长数转换

ORA-00997: illegal use of LONG datatype

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')) 
/
+0

什么是错误测试? – 2012-04-24 19:03:04

+0

ORA-00997:非法使用LONG数据类型 – mahen 2012-04-24 19:08:48

回答

6

长型卖场大变量lenght字符串,它不是一个数值类型。它有很多限制。 Oracle文档说:

使用长值是受到以下限制:

  • 一个表只能包含一个LONG列。
  • 您不能创建具有LONG属性的对象类型。
  • 长列不能出现在WHERE或完整性约束中(除非它们可以出现在NOT NULL约束中)。
  • LONG列不能索引。
  • LONG不能在正则表达式中指定。
  • 存储函数返回一个LONG值。
  • 您可以使用LONG数据类型声明PL/SQL程序单元的变量或参数。但是,您不能从SQL调用程序单元。
  • 在一个单独的SQL语句,LONG列,更新的表,并锁定表必须位于同一个数据库。 LONG和LONG RAW列不能在分布式SQL语句中使用,并且不能被复制。
  • 如果一个表具有LONG列和LOB列,则不能将4000字节以上的数据绑定到同一SQL语句中的LONG列和LOB列。但是,您可以将多于4000个字节的数据绑定到LONG或LOB列。
3

为了检查或使用长列的值,你必须写一些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; 

分享和享受。

0

如果你不想写任何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不使用COLUMN_NAME ...

在你的情况,因为你查询VIEW这是一个比较复杂一点。 这是必要的视图代码挖掘和重写查询为:

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