CLOBデータ型の列がいくつかあるクエリを実行しようとしています。通常のようにクエリを実行すると、これらのフィールドはすべて、値として(CLOB)
を持ちます。
DBMS_LOB.substr(column
)を使用してみましたが、エラーが発生します
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
CLOB列を照会するにはどうすればよいですか?
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;
これは動作します
select DBMS_LOB.substr(myColumn, 3000) from myTable
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を単純に連結して電子メールとして送信しました。
大きなCLOBの選択には、次のものも使用できます。
SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo
それが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
別のオプションは、関数を作成し、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);