4

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

ORA-00997: 非法使用 LONG 数据类型

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'))
/
4

3 回答 3

7

Long 类型存储较大的可变长度字符串,它不是数字类型。它有很多限制。Oracle 文档说:

LONG 值的使用受以下限制:

  • 一个表只能包含一个 LONG 列。
  • 您不能创建具有 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 列。
于 2012-04-24T21:03:39.777 回答
5

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

分享和享受。

于 2012-04-25T11:45:06.913 回答
2

如果您不想编写任何 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>

不要在表 TABLE_NAME 的 ...your_condition 中使用 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 上测试

于 2017-08-31T18:42:53.480 回答