程序插入數據報錯ORA-01461: can bind a LONG value only for

我的ORACLE表裏沒有long字段,可是保存時報錯:

ORA-01461 :僅可以爲插入LONG列的LONG值賦值
ORA-01461: can bind a LONG value only for insert into a LONG column

本來我這張表裏只有一個VARCHAR2(4000)的字段,一直沒有這種錯誤發生,後來我把另一個字段長度調整爲VARCHAR2(4000),這錯誤就開始發生了。

你的數據庫字符集可能是UTF-8的,對於UTF-8或歐洲的某些字符集,oracle在存儲時,對於一個字符需要2個或3個字節的存儲空間,雖然表定義中爲varchar2(4000),但是其實該字段的data_length爲其2倍或3倍長。這種情況下oracle會把data_length長度超過4000的當做LONG型處理,你的表中有兩個這樣的字段,插入數據時相當於同時操作2個LONG字段,所以報錯。
建議減小字段長度或拆分

案例2:

今天接到開發人員報告:在用jdbc導入數據時遇到ORA-01461
ORA-01461 can bind a LONG value only for insert into a LONG column

Cause: An attempt was made to insert a value from a LONG datatype into another datatype. This is not allowed.

Action: Do not try to insert LONG datatypes into other types of columns.

這個錯誤一般發生在插入或者更新Varchar2類型的字段

實際引起這個錯誤的主要原因是字符集問題及字符串長度到原因,根據本人遇到到情況一共分兩種:
1、插入到字符串長度大於4000字節
2、插入到表中的記錄其中一個是long類型、還有其他實際長度大於2000個字節(如果是UTF-8,則是1333個字節);或者是插入的記錄中有兩個或兩個以上長度大於2000字節的字符串

用以下SQL可以查出有可能引起ORA-01461錯誤的表:
SELECT FROM
(SELECT TABLE_NAME, OWNER, count(
) NUM
FROM DBA_TAB_COLUMNS
WHERE DATA_TYPE='LONG'
OR (( DATA_TYPE='VARCHAR2'
or DATA_TYPE='CHAR'
or DATA_TYPE='NVARCHAR2'
or DATA_TYPE='NCHAR')
AND DATA_LENGTH > 1333)
AND OWNER NOT IN
('SYS','SYSTEM','SH','OLAPSYS','MDSYS','WKSYS','ODM','XDB','WMSYS')
GROUP BY TABLE_NAME, OWNER)
WHERE NUM > 1

在本例中,更好是插入到記錄有2個字段長度大於2000,由於數據庫字符集不可更改,故結合實際業務邏輯,將插入記錄到其中一個字符串長度縮減在2000字節以下,解決連問題.

轉載至:https://www.cnblogs.com/yangkai-cn/p/4016611.html

我們的數據庫中插入報錯的表有2個VARCHAR2(4000)的列。但是插入的時候,其中一個列賦值,另一個列設置爲null。
所以建議程序員:將表中column size 4000的列在程序中的變量值 size 調小至2000.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章