sql - oracle 长到数字的转换

标签 sql oracle oracle10g

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

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

最佳答案

如果您不想编写任何 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。
有必要挖掘 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 上测试

关于sql - oracle 长到数字的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10304218/

相关文章:

sql - 如何在选择查询中使用变量?

sql - 在字符串中查找第二组数字(SQL/PL-SQL)

sql - 对 Oracle PL/SQL 表类型使用 MERGE 语句时,是什么原因导致 'invalid datatype' 错误?

java - 如何使用 JDBC 在数据库中插入引用值?

java - Listagg函数和ORA-01489 : result of string concatenation is too long

mysql - 如何过滤掉数字范围内的 SQL 行?

sql - LEFT JOIN 使用子查询不返回空结果为 "0"

sql - 如何在 sqldeveloper 中使用 IF else 条件检索最新实例

SQL查询协助

sql - ORACLE SQL 查询关于连接到一个连接