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

Sql 在Oracle数据库中搜索长数据类型的最佳方法是什么?,sql,oracle,sql-like,ora-00932,Sql,Oracle,Sql Like,Ora 00932,我正在使用一个将HTML存储为长数据类型的Oracle数据库。我想查询数据库以搜索存储在Long中的HTML数据中的特定字符串 我尝试了“从表中选择*列,如“%form%”。这会导致以下Oracle错误,因为长数据类型不支持“like” ORA-00932:不一致的数据类型:预期数量为LONG您无法直接搜索LONG。long不能出现在WHERE子句中。它们可以出现在“选择”列表中,这样您就可以使用它来缩小需要检查的行数 Oracle建议至少在过去的两个版本中将long转换为clob。CLOB的限

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

我尝试了“从表中选择*列,如“%form%”。这会导致以下Oracle错误,因为长数据类型不支持“like”


ORA-00932:不一致的数据类型:预期数量为LONG

您无法直接搜索LONG。long不能出现在WHERE子句中。它们可以出现在“选择”列表中,这样您就可以使用它来缩小需要检查的行数


Oracle建议至少在过去的两个版本中将long转换为clob。CLOB的限制更少。

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

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

示例:

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函数将只搜索长度的前32K。

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

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个字符,就会出现问题。

首先将
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%';

如果要删除匹配的行,请参见以下答案:rowid=r表示什么。我的意思是“从longtable(其中rowid=r)将文本选择到临时的\u varchar中”;然而,对所有\u触发器的描述将触发器\u主体显示为long。推荐然后自己不做?奇怪…与DBA_IND_表达式相同。如果您描述一下,COLUMN_表达式在11GR2中仍然是一个长类型。我希望Oracle也能修复字典中的长列,但考虑到数据字典的大小和复杂性,我怀疑将所有long升级到CLOB将是一项巨大的工作,在升级过程中会有损坏的风险,因此到目前为止Oracle决定不使用它。如果您正在查找触发器的文本,您可以选择使用DBA\u源、USER\u源或all\u源。