15

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

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

ORA-00932: 不一致的数据类型: 预期 NUMBER 长

4

5 回答 5

13

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

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

于 2014-12-09T12:54:13.357 回答
11

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

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

于 2009-04-20T20:07:34.510 回答
8

例子:

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。

于 2009-04-21T05:56:25.140 回答
5

首先将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%';
于 2016-04-25T13:15:06.090 回答
2

不要使用 LONG,而是使用 CLOB。您可以索引和搜索 CLOB,例如 VARCHAR2。

此外,使用前导通配符 (%) 进行查询将始终导致全表扫描。而是查看Oracle Text 索引。

于 2009-04-21T00:11:42.020 回答