PL/SQL CLOB型の文字列をバイト数を指定して取得する
PL/SQLでCLOB型の文字列をバイト数を指定して取得する方法を紹介します。
VARCHAR2などの文字列をバイト数を指定して取得する場合はOracle 文字列を指定した範囲の長さに切り取るで紹介したようにSUBSTRBを使用しますが、CLOBの場合はエラーになってしまいます。
VARCHAR2の型に登録するために4000バイト 1にカットするケースが多いかと思いますが、そのようなときは以下のようにします。
tmp_str VARCHAR2(32767);
tmp_str := DBMS_LOB.SUBSTR(tmp_clob, 4000, 1);
WHILE LENGTHB(tmp_str) > 4000 LOOP
tmp_str := SUBSTR(tmp_str, 1, LENGTH(tmp_str) - 1);
END LOOP;DBMS_LOB.SUBSTR(tmp_clob, 4000, 1)で、CLOBの文字列を4000文字まで取得します。
バイト数ではなく、文字数で取得するため、4000バイトを超えてしまいます。
そのため、32767バイトのVARCHAR2の変数を定義して、その変数にセットします。
VARCHAR2は最大4000バイト 1までしか登録できませんが、PL/SQLの変数で扱えるバイト数は32767バイトです。
詳しくは以下のサイトが参考になります。
参考ページ(外部サイト): https://www.shift-the-oracle.com/plsql/data-type.html
その後、4000バイト以下になるまでループして、末尾を1文字づつ削除していきます。
Oracleのバージョンが12c以降の場合は4000バイト以上登録できるように設定する方法もあります。 ↩