oracle

SQL*Plus でCLOBやLONG型のデータを出力する際に気を付ける事

sqlplusを使っていてCLOBやLONG型のデータを出力する際、途中で切れたり意図しないところで改行されて困ったりしていませんか。V$SQLやV$SQLAREAのSQL_FULLTEXTや、DDL出力の際お世話になるmetadata.get_ddlを使っているとでいつかは行きつくお困りごとだと思います。対策のポイントは以下です。(設定値は一例です)

SET LINESIZE      1024
SET LONG          5000000
SET LONGCHUNKSIZE 5000000
SET PAGESIZE      0

LINESIZEは1行に表示するバイト数を、LONGCHUNKSIZEと、LONGにはselectでメモリに読み込む最大値を設定する。例えばCLOBでは1メガのデータが格納されているのにSET LONG 1024とした場合頭から1Kで切り捨てられるので少し大きめを指定するとよいです。但しLONGの最大値は2Gです。
LONGCHUNKSIZEについては正直イマイチうまく説明できません。マニュアルにはフェッチサイズとも記載がされているので、LINESIZEと同じにしておけば、実質問題ないように思えるのですがLinux環境、Windows環境で少し挙動が変わります(Windows環境ではイメージした動きになるのですが、、)。結局、思考錯誤して行きついたのが、LONGに指定する同じ値を設定すれば良いって事でした。とりあえず今のところこれで問題ないようです。

見落としがちな注意点として、SQL*Plusを実行するターミナル自体の最大表示幅があります。LinuxだとほぼTeratTermでWindows環境ならdos窓もしくはpowershellでしょうか、、こちらの値も意識して設定の必要あります。

SQL> SET LINESIZE      1024
SQL> SET LONG          5000000
SQL> SET LONGCHUNKSIZE 5000000
SQL> select s.SQL_FULLTEXT from v$sql s where s.SQL_ID= '0pyq96jtkdr31'
  2  ;

                         SQL_FULLTEXT
_____________________________________
select '伊集院' as "'--姓--'"
/* '20/06/01 訂正
 ,'光' as "名"
 *
 */
,'ヒカル' as "/* 名 */"
,'45' "年齢"  -- 2020/07/01 追加
-- '男' as "性別"
,'1行目
2行目
-- 3行目 ここは有効
/*
4行目 ここも有効
 */
5行目' as "備考"
from dual

SQL>
スポンサーリンク
タイトルとURLをコピーしました