開発時に発生するエラー
ORA-01704: 文字列リテラルが長すぎます
長い文字列を挿入したり更新したりするときに発生する問題。
原因
文字列リテラル はデータベースに格納可能な VARCHAR2 の仕様にあわせるように 4000 バイトを
格納できるように 4000 文字が上限になっている。
しかし、LONG や CLOB の場合には、それでは不足する。
INSERT INTO clob_table (clob_col) VALUE ('・・・・〜 4K 以上 約 64 KB 以内');
ORA-01704: 文字列リテラルが長すぎます
対応
SQL の文字列が 64 KB 以内(※)に収まる場合
単一のリテラルでは 4000 文字に制限されるが、4000 文字のいくつかの集まりで構成すれば問題を回避できる
INSERT INTO clob_table (clob_col) VALUES (
TO_CLOB('…') || TO_CLOB('…') || ....
) ;
TO_CLOB 関数が使用できるのは Oracle 9i 以降
(※) SQL 長さ制限 64K バイトというのは 10g では解消されている。 ⇒ Oracle 性能限界
対応
SQL の全体の文字列が 64 KB を超える場合 (CLOB などの場合では十分考えられる)
こちらは 単一の SQL 文では実現できない。PL/SQL とバインド変数を使用することで実現する(※1)。
作成例では容易に確認できるように RPAD (※2) を使用している。
リテラルではないが、本質は同じである。
(※1) 単一の SQL でバインド変数が 4000 バイトを超過できるのは LONG と LOB のどちらか一方のみである。また、PL/SQL のバージョンによってバインド変数においてもサイズの上限が異なっている。(4K ⇒ 32KB ⇒ LOB と 2つの壁がある:Oracle 8i 近辺のため未確認)
(※2) RPAD は戻り値が PL/SQL の VARCHAR2 のため 32 KB が上限である。
ちなみに 32768 バイト以上になると ORA-06502: PL/SQL: 数値または値のエラー が発生する。
DECLARE
vClob CLOB;
BEGIN
vClob := RPAD('x', 32767, 'x');
vClob := vClob || RPAD('y', 32767, 'y');
INSERT INTO LOB_TEST (CL) VALUES (vClob);
COMMIT;
END;
/
過去のどのバージョンまで適用できるか未確認。
一覧ページへ戻る
OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。