我正在使用存储HTML的Long数据类型的Oracle数据库。 我想查询数据库以搜索Long中存储的HTML数据中的特定字符串。
我尝试过"select * from TABLE where COLUMN like '%form%'",但由于Long数据类型不支持"like",因此会导致以下Oracle错误:
ORA-00932:不一致的数据类型:期望 NUMBER 类型,得到 LONG 类型
您可以不使用临时表来使用此示例:
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。 LONG不能出现在WHERE子句中。但是它们可以出现在SELECT列表中,因此您可以使用它来缩小要检查的行数。
Oracle自过去两个版本以来一直建议将LONG转换为CLOB。 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函数仅会搜索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%';
不要使用LONG,改用CLOB。您可以像VARCHAR2一样对CLOB进行索引和搜索。
此外,如果查询使用前导通配符(%),将始终导致全表扫描。请尝试使用Oracle Text索引。