2009-04-20 16 views
10

私は、HTMLをLongデータ型として格納するOracleデータベースを使用しています。 Longに格納されているHTMLデータ内の特定の文字列を検索するようにデータベースにクエリを行いたいと思います。Oracleデータベース内のLongデータ型を検索する最善の方法は何ですか?

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

ORA-00932:一貫性のないデータ型:予想数値は、直接LONG型を検索することはできません

答えて

9

LONGました。 LONGはWHERE句には使用できません。 SELECTリストに表示することができますので、それを使って調べなければならない行の数を絞り込むことができます。

少なくとも過去2回のリリースでは、LONGからCLOBへの変換を推奨しています。 CLOBには制限が少なくなります。

+9

をさらに、ALL_TRIGGERSで記述は限りTRIGGER_BODYを示しています。推薦し、それ自体をしないでください? odd ... – xQbert

+0

DBA_IND_EXPRESSIONSと同じです。あなたがそれを記述すると、COLUMN_EXPRESSIONは11GR2では依然として長い型です。 – pahariayogi

+0

Oracleは辞書のLONG列も修正したいと思っていますが、データ・ディクショナリのサイズと複雑さを考えると、すべてのLONGをCLOBにアップグレードすることはアップグレード中の破損を招く恐れがあるため、それだけで。 –

0

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

さらに、先頭のワイルドカード(%)で照会すると、常にフルテーブルスキャンが行われます。代わりにOracle Text indexesを見てください。

7

例:

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

+0

一致する行を削除する場合は、この回答を参照してください。 http://stackoverflow.com/questions/2381203/oracle-delete-where-long-like/2381600#2381600 – Sam

+0

https://forums.oracle.com /forums/thread.jspa?threadID=413669#1418208 –

+0

rowid = rはどういう意味ですか?私はここで "longidableからの一時的なVARCHARへのテキストの選択(rowid = r; – Yashu

0

長い方の列を廃止予定にしているので、長い列をclobに変換することをお勧めします。または、そのデータを読み取るためにpl/sqlブロックを作成します。明確な説明については、下のリンクを参照してください。

参考文献:http://www.oraclebin.com/2012/12/using-long-data-type-in-where-clause-in.html

+1

ようこそスタックオーバーフロー!以下の2つの理由から、あなた自身のウェブサイト/製品への裸のリンクは推奨されません。まず、外部サイトへの単なるリンクではなく、自己完結型の回答として回答を投稿する必要があります。第2に、自己宣伝はここでは嫌われる傾向があり、多くの場合、スパムとして警告されます(特に、自分のサイト/製品にリンクしているという開示がない場合)。 –

9

あなたは一時テーブルを使用せずにこの例を使用することができます。

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

1

まず、例えば、LIKE条件を使用し、次いでCLOB型にLONG型の列を変換:

CREATE TABLE tbl_clob AS 
    SELECT to_lob(long_col) lob_col FROM tbl_long; 

SELECT * FROM tbl_clob WHERE lob_col LIKE '%form%'; 
関連する問題