web-dev-qa-db-ja.com

OracleでCLOB列を照会する方法

CLOBデータ型の列がいくつかあるクエリを実行しようとしています。通常のようにクエリを実行すると、これらのフィールドはすべて、値として(CLOB)を持ちます。

DBMS_LOB.substr(column)を使用してみましたが、エラーが発生します

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

CLOB列を照会するにはどうすればよいですか?

41
Catfish

CLOB列の部分文字列を取得し、サイズ/バッファの制限があるクエリツールを使用する場合、BUFFERをより大きなサイズに設定する必要がある場合があります。たとえば、SQL Plusを使用している場合、SET BUFFER 10000を使用して、デフォルトが4000であるため、10000に設定します。

DBMS_LOB.substrコマンドを実行すると、返す文字の量とそこからのオフセットを指定することもできます。したがって、DBMS_LOB.substr(column, 3000)を使用すると、バッファーに十分な量に制限される場合があります。

Substrコマンドの詳細については、 Oracle documentation を参照してください

 
 DBMS_LOB.SUBSTR(
 LOB_loc IN CLOB CHARACTER SET ANY_CS、
 amount IN INTEGER:= 32767、
 offset IN INTEGER:= 1) 
 RETURN VARCHAR2 CHARACTER SET lob_loc%CHARSET; 
 
40
mrjohn

これは動作します

select DBMS_LOB.substr(myColumn, 3000) from myTable
66
Chris

OracleデータベースのHugeClobで別の条件に遭遇しました。 dbms_lob.substrは、関数で4000の値のみを許可しました。例:

dbms_lob.substr(column,4000,1)

そのため、HughClobの方が大きかったため、selectで2つの呼び出しを使用する必要がありました。

select dbms_lob.substr(column,4000,1) part1, 
       dbms_lob.substr(column,4000,4001) part2 from .....

私はJavaアプリから呼び出していたので、part1とpart2を単純に連結して電子メールとして送信しました。

8
Cliff Bender

大きなCLOBの選択には、次のものも使用できます。

SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo

1
Kapitula Alexey

それがCLOBの場合、なぜ列をto_charしてから正常に検索できないのですか?

テーブルを作成する

CREATE TABLE MY_TABLE(Id integer PRIMARY KEY, Name varchar2(20), message clob);

このテーブルにいくつかのレコードを作成します

INSERT INTO MY_TABLE VALUES(1,'Tom','Hi This is Row one');
INSERT INTO MY_TABLE VALUES(2,'Lucy', 'Hi This is Row two');
INSERT INTO MY_TABLE VALUES(3,'Frank', 'Hi This is Row three');
INSERT INTO MY_TABLE VALUES(4,'Jane', 'Hi This is Row four');
INSERT INTO MY_TABLE VALUES(5,'Robert', 'Hi This is Row five');
COMMIT;

CLOB列で検索する

SELECT * FROM MY_TABLE where to_char(message) like '%e%';

結果

ID   NAME    MESSAGE   
===============================  
1    Tom     Hi This is Row one         
3    Frank   Hi This is Row three
5    Robert  Hi This is Row five
0
Raj

別のオプションは、関数を作成し、clob列を選択する必要があるたびにその関数を呼び出すことです。

create or replace function clob_to_char_func
(clob_column in CLOB,
 for_how_many_bytes in NUMBER,
 from_which_byte in NUMBER)
return VARCHAR2
is
begin
Return substrb(dbms_lob.substr(clob_column
                            ,for_how_many_bytes
                            ,from_which_byte)
            ,1
            ,for_how_many_bytes);
end;

そしてその関数を次のように呼び出します。

SELECT tocharvalue, clob_to_char_func(tocharvalue, 1, 9999)
FROM (SELECT clob_column AS tocharvalue FROM table_name);
0
Mustafa