程序插入数据报错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.

原文地址:https://blog.51cto.com/214320/2479934

时间: 2024-11-03 22:27:58

程序插入数据报错ORA-01461: can bind a LONG value only for的相关文章

Entity Framework插入数据报错:Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

stackoverflow的解决方法 try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System

向Oracle数据库中CLOB插入数据报错问题

今天在项目中向数据库的CLOB属性插入一段篇文章(1000~2000)字就会报一个字符串过长的错误. 网上说用流来处理,没有这么做.这像是一个Bug,只要把插入的数据,默认扩充到2000以上就ok了. 下面是这段代码: if((temp.length()>=1000)&&(temp.length()<=2000)){ temp=StringUtils.rightPad(temp, 2008); } 使用StringUtils的rightPad方法使没超过2000的部分,在右边自

解决mysql插入数据报错[Err] 1146 - Table &#39;performance_schema.session_status&#39; doesn&#39;t exist

解决办法:1.打开cmd 执行命令cd/ 进入C盘根目录2.dir 查看C盘根目录下文件夹  找到 Program Files文件夹3.cd Program Files 进入该文件夹下 再输入dir 查看该文件夹下所有文件夹4.cd MySQL 进入该文件夹  再输入dir 查看该文件夹下所有文件夹5.cd MySQLServer 5.7 进入该文件夹  再输入dir 查看该文件夹下所有文件夹6.cd bin 进入该文件夹  7.输入mysql_upgrade -u root -p --forc

mysql插入数据报错IntegrityError: (1062, &quot;Duplicate entry &#39;xx&#39; for key &#39;xxxxx&#39;&quot;)

1.问题描述 MySQL插入数据的时候报错,提示如下: IntegrityError: (1062, "Duplicate entry 'xx' for key 'xxxxx'")2.问题分析 根据错误提示我们可以大致得到以下信息: 1.IntegrityError表示这个字段在MySQL中的类型为:整型. 2.Duplicate Entry:“Duplicate”——something that is an exact copy  of something else.所以这句话的意思

mysql插入数据报错1366

数据表插入中文数据报错 Warning Code : 1366 Incorrect string value: '\xE5\x9C\xA8' for column 'name' at row 1 原因是表中列的编码是默认 latin1 要改成utf8 ALTER TABLE student CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 把student表列编码改成utf8 SHOW FULL COLUMNS FROM student

数据库往表中插入数据报错

[Error Code: 1452, SQL State: 23000]  Cannot add or update a child row: a foreign key constraint fails (`workflow`.`act_id_membership`, CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`)) sql: INSERT INTO act_id_m

Mycat+Mysql 插入数据报错 i[Err] 1064 - partition table, insert must provide ColumnList

使用Navicat连接Mycat 8066 成功插入了分库表和全局表 1.全局表 sql如下: INSERT INTO `t_rank` VALUES ('259bfdc3-7922-4839-96c7-61c89e877dc5', '法国', '7', '11', '11', '12', null, '34'); INSERT INTO `t_rank` VALUES ('41eece5d-9d86-4cfe-b0ce-e6d4e4021cac', '中国', '2', '38', '27',

stl::map的insert插入数据报错:(Suspended : Signal : SIGSEGV:Segmentation fault)

最近接手一个老项目,在老项目中使用了map存储缓存数据,如下: #include "conf.h" int Frame::parse() { std::map<string, int64_t> tmpString; tmpString.insert(std::map<string, int64_t>::value_type(string("0000"), 12123323)); tmpString.insert(std::map<str

oracle插入数据报错ORA-26026

今天进行数据清理时发现报错ORA-26026,主要是把从交易库提取数据并插入到归档库中. 检查一下发现是归档库的索引问题. 当时为了提高插入速度,所以删除了归档库的索引,可能对主键索引产生了影响. 解决方案很简单,重新重建了一下该表的主键索引,问题解决. sql语句: alter index 索引名称 rebuild;