12 sql oracle ora-00932 sql-like
我正在使用Oracle数据库将HTML存储为Long数据类型.我想查询数据库以搜索存储在Long中的HTML数据中的特定字符串.
我试过,"从表中选择*,其中COLUMN喜欢'%form%'".这会导致以下Oracle错误,因为Long数据类型不支持"like".
ORA-00932:不一致的数据类型:预期NUMBER变长
小智 12
您可以在不使用临时表的情况下使用此示例:
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;
Run Code Online (Sandbox Code Playgroud)
当然,如果LONG的字符超过32K,则会出现问题.
Arn*_*hea 10
你无法直接搜索LONG.LONG不能出现在WHERE子句中.它们可以出现在SELECT列表中,因此您可以使用它来缩小您必须检查的行数.
Oracle建议至少在过去的两个版本中将LONG转换为CLOB.对CLOB的限制较少.
小智 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!
Run Code Online (Sandbox Code Playgroud)
不过要小心.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%';
Run Code Online (Sandbox Code Playgroud)