web-dev-qa-db-ja.com

Oracleデータベース内でLongデータ型を検索する最良の方法は何ですか?

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

「*から、 '%form%'のようなCOLUMNをTABLEから選択します」を試しました。 "like"はLongデータ型ではサポートされていないため、これにより次のOracleエラーが発生します。

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

12
Mike Munroe

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

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

10
Martin Selecký

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

オラクル社は、少なくとも過去2つのリリースでLONGをCLOBに変換することを推奨しています。 CLOBに対する制限はほとんどありません。

10
Arnshea

例:

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

7
Thomas Aregger

最初に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%';
2
nikli

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

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

1
Neil Kodner