首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle长号转换

oracle长号转换
EN

Stack Overflow用户
提问于 2012-04-24 18:52:30
回答 3查看 19.8K关注 0票数 4

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

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

代码语言:javascript
复制
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'))
/
EN

回答 3

Stack Overflow用户

发布于 2012-04-24 21:03:39

长类型存储大变量长字符串,它不是数字类型。它有许多局限性。Oracle文档说:

长值的使用受以下限制:

表只能包含一个长列。不能创建具有长attribute.

  • LONG列的对象类型,在其中不能出现或完整性约束(除了不能在常规的expressions.

  • A存储函数中指定indexed.

  • LONG和NULL expressions.

  • A列之外),返回一个长值。

  • 可以使用长数据类型声明PL/SQL程序单元的变量或参数。但是,不能在单个SQL语句、长列、更新表和锁定表中调用SQL.

  • 中的程序单元,必须位于相同的数据库中。长和长的原始列不能在分布式SQL语句中使用,也不能是replicated.

  • If表具有LONG和LOB列,那么您就不能将超过4000字节的数据绑定到同一SQL语句中的LONG和LOB列。但是,可以将超过4000字节的数据绑定到LONG或LOB列.

票数 7
EN

Stack Overflow用户

发布于 2012-04-25 11:45:06

为了检查或使用长列的值,您必须编写一些PL/SQL,类似于

代码语言:javascript
复制
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;

分享并享受。

票数 6
EN

Stack Overflow用户

发布于 2017-08-31 18:42:53

如果您不想编写任何PL/SQL,请尝试使用(通常情况下):

代码语言:javascript
复制
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.

在您的例子中,由于您查询了一个视图,所以它更复杂一些。有必要挖掘视图代码并将查询重写为:

代码语言:javascript
复制
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上测试

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10304218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档