53

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

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

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

CLOB列をクエリするにはどうすればよいですか?

4

8 に答える 8

79

これは動作します

select DBMS_LOB.substr(myColumn, 3000) from myTable
于 2010-11-17T01:24:20.120 に答える
49

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;

于 2010-09-24T19:57:31.860 に答える
10

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を連結してメールで送信しました。

于 2017-02-20T13:00:57.927 に答える
7

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
于 2019-06-03T10:33:15.347 に答える
1

大きなCLOBの場合、selectも使用できます。

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

于 2016-05-04T11:17:52.400 に答える
0

もう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);
于 2012-12-06T14:50:29.217 に答える
-1

答えに追加します。

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 parameterclob抽出したいものです。

Second parameter抽出するclobの長さです。

Third parameter抽出したい単語です。

上記の例では、clobサイズが50000を超えていることがわかっているので、最後の4000文字が必要です。

于 2017-11-20T14:37:16.283 に答える
-3

SQL * Plusを使用している場合は、次のことを試してください...

set long 8000

select ...
于 2010-09-24T19:56:16.203 に答える