CLOBデータ型であるいくつかの列を持つクエリを実行しようとしています。通常のようにクエリを実行すると、これらのフィールドはすべて(CLOB)
値として保持されます。
)を使用してみDBMS_LOB.substr(column
ましたが、エラーが発生します
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
CLOB列をクエリするにはどうすればよいですか?
これは動作します
select DBMS_LOB.substr(myColumn, 3000) from myTable
CLOB列のサブストリングを取得し、サイズ/バッファー制限のある照会ツールを使用する場合、BUFFERをより大きなサイズに設定する必要がある場合があります。たとえば、SQL Plusを使用しSET BUFFER 10000
ている場合、デフォルトは4000であるため、を使用して10000に設定します。
コマンドを実行するDBMS_LOB.substr
と、返す文字数とオフセットを指定することもできます。したがって、を使用DBMS_LOB.substr(column, 3000)
すると、バッファに十分な量に制限される可能性があります。
substrコマンドの詳細については、Oracleのドキュメントを参照してください。
DBMS_LOB.SUBSTR( lob_loc IN CLOB CHARACTER SET ANY_CS、 整数の量:= 32767、 INTEGERのオフセット:= 1) RETURN VARCHAR2 CHARACTER SET lob_loc%CHARSET;
OracleデータベースのHugeClobで別の状態に遭遇しました。関数で許可されている唯一のdbms_lob.substr
値は4000です。例:
dbms_lob.substr(column,4000,1)
したがって、より大きなHughClobの場合、次の2つの呼び出しを使用する必要がありましたselect
。
select dbms_lob.substr(column,4000,1) part1,
dbms_lob.substr(column,4000,4001) part2 from .....
Javaアプリから呼び出していたので、part1とpart2を連結してメールで送信しました。
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の場合、selectも使用できます。
SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo
もう1つのオプションは、関数を作成し、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);
答えに追加します。
declare
v_result clob;
begin
---- some operation on v_result
dbms_lob.substr( v_result, 4000 ,length(v_result) - 3999 );
end;
/
のdbms_lob.substr
first parameter
clob
抽出したいものです。
Second parameter
抽出するclobの長さです。
Third parameter
抽出したい単語です。
上記の例では、clobサイズが50000を超えていることがわかっているので、最後の4000文字が必要です。
SQL * Plusを使用している場合は、次のことを試してください...
set long 8000
select ...