HTMLをLongデータ型として格納するOracleデータベースを使用しています。データベースにクエリを実行して、Longに格納されているHTMLデータ内の特定の文字列を検索します。
「*から、 '%form%'のようなCOLUMNをTABLEから選択します」を試しました。 "like"はLongデータ型ではサポートされていないため、これにより次のOracleエラーが発生します。
ORA-00932:データ型に一貫性がありません:予期されたNUMBERはLONGになります
一時テーブルを使用せずにこの例を使用できます。
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文字を超える場合は問題があります。
LONGを直接検索することはできません。 LONGはWHERE句には使用できません。ただし、それらはSELECTリストに表示されるため、これを使用して、調べる必要がある行の数を絞り込むことができます。
オラクル社は、少なくとも過去2つのリリースでLONGをCLOBに変換することを推奨しています。 CLOBに対する制限はほとんどありません。
例:
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のみを検索します。
最初に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%';
LONGを使用せず、代わりにCLOBを使用してください。 VARCHAR2のようなCLOBに索引を付けて検索できます。
さらに、先頭のワイルドカード(%)を使用してクエリを実行すると、常にフルテーブルスキャンが実行されます。代わりに Oracle Textインデックス を調べてください。