1. 程式人生 > 實用技巧 >oracle update or insert 欄位資料量過長

oracle update or insert 欄位資料量過長

在開發中遇到了一個問題,就是我需要插入 或更新一條資料,如:
update blog set content='11111111111111111...' where id = 1
這時候這個content資料長度是很大的,可以是幾千上萬個字元, 這時候執行這個sql語句就會出問題,

oracle sql ORA-01704: string literal too long

oracle 資料oracle 的sql 解析器無法直接處理怎麼長的資料(mysql可以),這時候要怎麼做才能更新或插入這個資料呢,有兩個方法 儲存過程 和 字元拼接

儲存過程
DECLARE  
  clobValue hushendayrecordlist.hushendayrecordlist%TYPE;  
BEGIN  
  content := '111122222233....',
  UPDATE blog b SET b.content = content WHERE id='1';
  COMMIT;
END;

使用儲存過程將要更新的字元資料賦值給變數, 然後執行sql 的時候sql 解析器直接從變數中獲取資料進行更新,在解析器校驗sql的時候sql 就沒有那麼長了,這樣就避免了sql 過長的問題,但是,在專案中是無法使用這個儲存過程的, 所以這個方法只能捨棄

concat or ||

concat 或 || 可以將資料拼接到原資料後面, 可以這樣來使用
update blog set content = concat('', '1111111111111') where id = 1
or
update blog set content = '' || '1111111111111' where id = 1


不過這種情況還是無法解決 資料多長的問題,因為拼接資料的時候, 新資料的長度不能超過1000個字元,不然也會報錯, 這時候可以使用 to_clob()函式,to_clob('111111...')可以儲存4000個字元的資料,然後用這個 to_clob 進行拼接, 如:

update blog set content = '' || to_clob('1111111...')

如果字元長度超過 4000個字元的時候呢?這時候可以將要更新的新資料按長度進行切割,然後使用多個拼接進行更新, 如:
update blog set content = content || to_clob('111111111...') || to_clob('22222222...') || to_clob('333333...') ... where id = 1


多個to_clob()就可以將可以用一條update 更新 幾千上萬字元長度的資料, 這個時候雖然sql還是很長,但是有 to_clob()進行包裹,這時候sql 解析器應該是略過這個函式,不把這個to_clob()當做正常的sql欄位進行計算,