java.sql.BatchUpdateException: ORA-12899

最近遇到一个问题,在用JDOM组件解析XML文件数据,并将数据存储到oracle数据库时,出现了如下错误:

<span style="font-family:SimSun;font-size:12px;">Exception in thread "main" java.sql.BatchUpdateException: ORA-12899: value too large for column "SCOTT"."EMP1"."JOB" (actual: 12, maximum: 9)

	at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:367)
	at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:8738)
	at com.uestc.util.InsertEmp.main(InsertEmp.java:48)</span>
要解析的XML文件如下所示:
<span style="font-family:SimSun;font-size:12px;"><?xml version="1.0" encoding="GBK"?>
<emps>
	<emp>
		<empno>1000</empno>
		<ename>诸葛亮</ename>
		<job>经理</job>
		<hiredate>1998-09-19</hiredate>
		<sal>3000</sal>
		<comm>500</comm>
	</emp>
	<emp>
		<empno>1001</empno>
		<ename>关云长</ename>
		<job>经理</job>
		<hiredate>1999-03-12</hiredate>
		<sal>3500</sal>
		<comm>200</comm>
	</emp>
	<emp>
		<empno>1002</empno>
		<ename>赵子龙</ename>
		<job>项目经理</job>
		<hiredate>2000-07-27</hiredate>
		<sal>5000</sal>
		<comm>1600</comm>
	</emp>
	<emp>
		<empno>1003</empno>
		<ename>刘玄德</ename>
		<job>人事</job>
		<hiredate>2001-03-14</hiredate>
		<sal>2000</sal>
		<comm>1300</comm>
	</emp>
</emps></span>

事先已在oracle数据库中创建了emp1表,创建脚本语句为:

<span style="font-family:SimSun;font-size:12px;">CREATE TABLE emp1(
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2)
);</span>

问题的原因是对oracle中文字符集编码的了解不够。

查看oraccle server端字符集,输入以下查询语句:

select userenv('language') from dual;

如果显示的是以下内容:

<span style="font-family:SimSun;font-size:12px;">SIMPLIFIED CHINESE_CHINA.ZHS16GBK</span>
则oracle每个汉字字符占据两个字节。

如果显示的是以下内容:

SIMPLIFIED CHINESE_CHINA.AL32UTF8

则oracle每个汉字占据三个字节。

经查询本地的数据库编码是AL32UTF8,每个汉字占3个字节,因此job中“项目经理”占据了12个字节,而创建的数据库表中只分配了9个字节,因此抛出了这个异常。将数据表的创建脚本改为如下所示,问题就解决了:

<span style="font-family:SimSun;font-size:12px;">CREATE TABLE emp1(
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(12),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2)
);</span>







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值