15

HTMLをLongデータ型として格納するOracleデータベースを使用しています。Longに保存されているHTMLデータ内の特定の文字列を検索するためにデータベースにクエリを実行したいと思います。

「SELECTfromTABLE where COLUMN like'%form%'」を試してみました。Longデータ型では「like」がサポートされていないため、これにより次のOracleエラーが発生します。

ORA-00932:データ型に一貫性がありません:予期されたNUMBERがLONGになりました

4

5 に答える 5

13

一時テーブルを使用せずにこの例を使用できます。

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 文字を超える場合は問題があります。

于 2014-12-09T12:54:13.357 に答える
11

LONG を直接検索することはできません。LONG は WHERE 句には使用できません。ただし、それらは SELECT リストに表示される可能性があるため、それを使用して、調べる必要がある行の数を絞り込むことができます。

Oracle は、少なくとも過去 2 つのリリースで LONG を CLOB に変換することを推奨しています。CLOB に対する制限は少なくなります。

于 2009-04-20T20:07:34.510 に答える
8

例:

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 のみを検索します。

于 2009-04-21T05:56:25.140 に答える
2

LONG を使用せず、代わりに CLOB を使用してください。VARCHAR2 のような CLOB を索引付けおよび検索できます。

さらに、先頭にワイルドカード (%) を使用してクエリを実行すると、常にフル テーブル スキャンが実行されます。代わりに、 Oracle Text の索引を調べてください。

于 2009-04-21T00:11:42.020 に答える