最近遇到了一個這樣的問題,在對Oracle數據庫插入或者更新CLOB字段的時候,直接拼接了一個INSERT INTO和UPDATE語句,類似下面這種:
INSERT INTO 表名(字段1, 字段2, CLOB字段) VALUES ('XX', 'XXX', '內容非常多'); UPDATE 表名 T SET T.CLOB字段名 = '內容非常多';
在執行SQL的時候報了[ORA-01704:字符串文件太長]的錯誤,如下圖所示:
以上SQL語法沒有任何問題,但是如果CLOB字段的內容非常大的時候,會導致SQL語句過長,我認可網上的這個說法:隱式轉換,oracle默認把字符串轉換成varchar2類型,而這個字符串的長度,又比4000大,所以會報ora-01704錯誤。說得通俗一點,就是兩個單引號之間的字符不能超過4000。應該不是clob存不下,而是insert語句插入的時候字符串存不下,你應該分多次插入。
遇到這個問題,可以使用PL/SQL語法,采取綁定變量的方式解決,而不是直接拼接SQL,例如:
DECLARE clobValue 表名.字段名%TYPE; BEGIN clobValue := 'XXX'; --字段內容 UPDATE 表名 T SET T.字段名 = clobValue WHERE 條件; COMMIT; END; /
注:END;末尾加“/”的意思是執行這段PL/SQL代碼,如果多個PL/SQL代碼需要同時執行,末尾必須加上該符號。