在Oracle数据库中搜索Long数据类型的最佳方法是什么?

时间:2009-04-20 19:33:50

标签: sql oracle sql-like ora-00932

我正在使用Oracle数据库将HTML存储为Long数据类型。我想查询数据库以搜索存储在Long中的HTML数据中的特定字符串。

我试过,“从TABLE中选择*,其中COLUMN喜欢'%form%'”。这会导致以下Oracle错误,因为Long数据类型不支持“like”。

ORA-00932:数据类型不一致:预期NUMBER变为LONG

5 个答案:

答案 0 :(得分:10)

您无法直接搜索LONG。 LONG不能出现在WHERE子句中。它们可以出现在SELECT列表中,因此您可以使用它来缩小您必须检查的行数。

Oracle建议至少在过去的两个版本中将LONG转换为CLOB。对CLOB的限制较少。

答案 1 :(得分:10)

您可以在不使用临时表的情况下使用此示例:

DECLARE

  l_var VARCHAR2(32767); -- max length

BEGIN

FOR rec IN (SELECT ID, LONG_COLUMN FROM TABLE_WITH_LONG_COLUMN) LOOP
  l_var := rec.LONG_COLUMN;
  IF l_var LIKE '%350%' THEN -- is there '350' string?
    dbms_output.put_line('ID:' || rec.ID || ' COLUMN:' || rec.LONG_COLUMN);
  END IF;
END LOOP;

END;

当然LONG的字符超过32K时会出现问题。

答案 2 :(得分:7)

示例:

create table longtable(id number,text long);

insert into longtable values(1,'hello world');
insert into longtable values(2,'say hello!');

commit;

create or replace function search_long(r rowid) return varchar2 is
temporary_varchar varchar2(4000);
begin
select text into temporary_varchar from longtable where rowid=r;
return temporary_varchar;
end;
/


SQL> select text from longtable where search_long(rowid) like '%hello%';                                                                              

TEXT
--------------------------------------------------------------------------------
hello world
say hello!

但要小心。 PL / SQL函数只搜索LONG的前32K。

答案 3 :(得分:2)

首先将LONG类型列转换为CLOB类型,然后使用LIKE条件,例如:

CREATE TABLE tbl_clob AS
   SELECT to_lob(long_col) lob_col FROM tbl_long;

SELECT * FROM tbl_clob WHERE lob_col LIKE '%form%';

答案 4 :(得分:1)

不要使用LONG,而是使用CLOB。您可以索引和搜索像VARCHAR2这样的CLOB。

此外,使用前导通配符(%)查询将始终导致全表扫描。请改为Oracle Text indexes