Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle长到数字转换_Sql_Oracle_Oracle10g - Fatal编程技术网

Sql oracle长到数字转换

Sql oracle长到数字转换,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我试图从all_tab_partitions表中获取当前分区的名称。当我尝试比较高_值(长数据类型)和数字时。它抛出一个错误: ORA-00997:非法使用长数据类型 Long类型存储大的可变长度字符串,它不是数字类型。它有许多局限性。Oracle文档说明: 长值的使用受以下限制: 一个表只能包含一个长列 不能创建具有LONG属性的对象类型 长列不能出现在WHERE或完整性约束中(除非它们可以出现在非空约束中) 无法为长列编制索引 不能在正则表达式中指定LONG 存储函数返回长值 可以使用长数

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


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


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

长值的使用受以下限制:

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

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

共享和享受。

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


在Oracle 11g上测试

ORA-00997:非法使用长数据类型
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;
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>
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'))