私は次の機能を持っています:
CREATE OR REPLACE FUNCTION GetVarchar2 (iclCLOB IN Nvarchar2)
return NVARCHAR2
IS
cnuMAX_LENGTH Constant number := 32767 ;
nuLength Number := DBMS_LOB.getlength(iclCLOB);
sbBuffer Nvarchar2(32767);
begin
dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
return sbBuffer;
END;
このように呼び出すと:
select GetVarChar2(text) from posts where postid = 'anId';
次のエラーが表示されます。
ORA-22835: CLOBからCHARまたはBLOBからRAWへの変換にはバッファが小さすぎます(実際: 6058、最大: 2000)
22835.00000 - "CLOBからCHARまたはBLOBからRAWへの変換にはバッファが小さすぎます(実際: %s、最大: %s)"
*原因: CLOB を CHAR または BLOB を RAW に変換しようとしましたが
、LOB サイズが CHAR および RAW
型のバッファ制限を超えていました。
列に対して文字長セマンティクスが有効な場合、幅は文字単位でレポートされます。それ以外の場合、幅はバイト単位でレポートされます。
*処置: 次のいずれかを
実行してください。 1. 変換を実行する前にLOBを小さくしてください。
たとえば、CLOBでSUBSTRを使用します。
2. DBMS_LOB.SUBSTR を使用して、CLOB を CHAR に、または BLOB を RAW に変換します。
問題は、タイプ NCLOB の posts テーブルのテキストのサイズが 6059 バイトであることです。関数を呼び出さずにこれを行うと、うまく動作するので奇妙です。つまり、次のスクリプトを実行すると:
declare
iclCLOB nvarchar2(6100) := 'Here is the same 6059 bytes string';
cnuMAX_LENGTH number := 32767 ;
nuLength Number := DBMS_LOB.getlength(iclCLOB);
sbBuffer Nvarchar2(32767);
sbBuffer1 Nvarchar2(32767);
begin
dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
select GetVarChar2(text) into sbBuffer1 from posts where postid = 'anId';
end;
問題なく動作します。
ありがとうございました。