java.sql.BatchUpdateException: ORA-12899
最近遇到一个问题,在用JDOM组件解析XML文件数据,并将数据存储到oracle数据库时,出现了如下错误:
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)
要解析的XML文件如下所示:
<?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>
事先已在oracle数据库中创建了emp1表,创建脚本语句为:
CREATE TABLE emp1( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(9), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2) );
问题的原因是对oracle中文字符集编码的了解不够造成的。
查看oraccle server端字符集,输入以下查询语句:
select userenv('language') from dual;
如果显示的是以下内容:
SIMPLIFIED CHINESE_CHINA.ZHS16GBK则oracle每个汉字字符占据两个字节。
如果显示的是以下内容:
SIMPLIFIED CHINESE_CHINA.AL32UTF8则oracle每个汉字占据三个字节。
经查询本地的数据库编码是AL32UTF8,每个汉字占3个字节,因此job中“项目经理”占据了12个字节,而创建的数据库表中只分配了9个字节,因此抛出了这个异常。将数据表的创建脚本改为如下所示,问题就解决了:
CREATE TABLE emp1( empno NUMBER(4), ename VARCHAR2(10), job VARCHAR2(12), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2) );
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。