Каков наилучший способ поиска 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.
Ответ 6
Лучший способ - преобразовать длинный столбец в clob, поскольку он устарел. Или напишите блок pl/sql для чтения этих данных. См. Ниже ссылку для пояснения.
Ссылки: http://www.oraclebin.com/2012/12/using-long-data-type-in-where-clause-in.html