Каков наилучший способ поиска Long datatype в базе данных Oracle?

Я работаю с базой данных Oracle, которая хранит HTML как длинный тип данных. Я хотел бы запросить базу данных для поиска определенной строки в данных HTML, хранящихся в Long.

Я попробовал, "выберите * из таблицы, где COLUMN нравится" % form% ". Это вызывает следующую ошибку Oracle, потому что" как" не поддерживается для длинных типов данных.

ORA-00932: непоследовательные типы данных: ожидаемый NUMBER получил LONG

Ответ 1

Вы не можете искать LONG напрямую. LONG не могут появляться в предложении WHERE. Они могут отображаться в списке SELECT, поэтому вы можете использовать это, чтобы сузить количество строк, которые вам нужно было бы изучить.

Oracle рекомендовала конвертировать LONG в CLOB для, по крайней мере, двух последних выпусков. Ограничений на CLOB меньше.

Ответ 2

Этот пример можно использовать без использования таблицы temp:

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 символов.

Ответ 3

Пример:

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 LONG.

Ответ 4

Сначала преобразуйте столбец типа 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%';

Ответ 5

Не используйте LONG, вместо этого используйте CLOB. Вы можете индексировать и искать CLOB, такие как VARCHAR2.

Кроме того, запрос с помощью главного шаблона (%) ВСЕГДА приведет к полному сканированию. Вместо этого обратите внимание на Oracle Text indexes.