【问题标题】:Oracle Error "inconsistent datatypes: expected CHAR got LONG"Oracle 错误“不一致的数据类型:预期的 CHAR 变长了”
【发布时间】:2014-12-17 10:33:30
【问题描述】:

我正在尝试运行以下查询来查找包含给定关键字的视图:

select  *
from    ALL_VIEWS
where   OWNER = 'SALESDBA'
        and TEXT like '%rownum%';

我收到以下错误消息:

ORA-00932: inconsistent datatypes: expected CHAR got LONG
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 4 Column: 13

如果我只是从 ALL_VIEWS 中选择,我会在 TEXT 字段中看到查询 (TEXT)。

我在这里做错了什么?

【问题讨论】:

  • 列 OWNER 的数据类型是什么? TEXT 列的数据类型是什么?
  • 所有者的类型是什么?
  • 问题出在 TEXT 字段上 - 如果我从查询中删除 and 和 TEXT like '%rownum% 则它会起作用 - 如前所述,我看到了查询 - 这意味着它是一个文本字段 - on我想过滤。

标签: sql oracle oracle11g


【解决方案1】:

您的问题是 TEXT 是 LONG 类型 - 尽管 Oracle 很久很久以前就弃用了这种类型,但他们仍然在自己的视图中使用它:-(

要将 LONG 转换为(可搜索的)CLOB,您可以使用TO_LOB() 函数(请参阅Oracle documentation for TO_LOB()

不幸的是,这不适用于简单的SELECT 语句。您必须创建一个中间表:

create table search_all_views as 
select  av.owner, av.view_name, to_lob(text) as text_clob
from    ALL_VIEWS av;

然后,您可以使用该表进行搜索:

select * 
from search_all_views
where text_clob like '%rownum%';

【讨论】:

  • @psaraj12 请仔细阅读文档:“在 CREATE TABLE 的子查询中,您不能使用 TO_LOB 函数将 LONG 列转换为 LOB 列 ... AS SELECT 语句 如果您正在创建一个索引组织的表”(在发布我的答案之前,我在 11gR2 上进行了尝试,它按预期工作)。
  • 是的,我也尝试过并且可以工作,但是为什么不能即时执行此操作,我的意思是在没有创建表的情况下使用简单的 sql。我真的不明白这个问题。
  • @Aramillo 我同意这是一个脑死的限制 - 如果您不能使用 CTAS 解决方法,那么我建议您联系 Oracle 支持。
【解决方案2】:

您可以使用 TEXT_VC 作为检查条件的列。例如:

select  *
from    ALL_VIEWS
where   OWNER = 'SALESDBA'
        and TEXT_VC like '%rownum%';

我希望这会有所帮助。

【讨论】:

  • 这是 12g 的有效更新,但需要注意的是,数据类型为 VARCHAR2(4000),因此可以截断文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2014-12-28
  • 2017-02-28
  • 2021-06-22
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多