Каков наилучший способ поиска типа данных Long в базе данных Oracle? - PullRequest
12 голосов
/ 20 апреля 2009

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

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

ORA-00932: несовместимые типы данных: ожидаемое ЧИСЛО получило ДОЛГО

Ответы [ 5 ]

10 голосов
/ 09 декабря 2014

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

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

10 голосов
/ 21 апреля 2009

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

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

7 голосов
/ 21 апреля 2009

Пример:

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 будет искать только первые 32 КБ LONG.

2 голосов
/ 25 апреля 2016

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

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

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

...