JAVA程序报ORA-01704: string literal too long错误的解决方法

       这个问题昨天我纠结了一天啊,在网上也没有搜出来什么东西,不过仍是对我有必定的影响滴,而后昨天晚上一直在这里奋战,其实也不全是搞这个问题,随意的作,很偶然滴试了一种办法,没想到,尽然成功了,兴奋啊,就出来八一八~~~
----------------------------------------------------------------------------------------------------------------------------
我使用的java写的,因此错误的详情以下:
java.sql.SQLException: ORA-01704: string literal too long

        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1160)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
        at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
        at myPackage.test.main(test.java:39)java


       因为数据库里定义的字段类型是varchar2(size)类型,而varchar2所规定的最高上限是4000,若是插入超过4000的话,就会报这个错误,而后上网搜了好久,大部分都说改为long或者clob类型,可是试了一下,仍是这个错误,long和clob所规定最大上限2G和4G彻底成为空谈。而后偶然看到一个大牛人物讲到使用PreparedStatement能够避免这个错误,因而又彻底把全部的Statement全调换成PreparedStatement仍是不能够,而后其中有一个细节问题就是PreparedStatement的传参问题,我开始搞的不是很懂,后来试了一下这个,固然是随便试了一下,没想到居然成功了,而后接着这个传参问题就一清二楚了。sql


先讲一下这个传参问题:
(PreparedStatement).setString(parameterIndex, x)
这只是里边一个方法而已,具体设置什么类型,根据你字段的定义而定。
其中参数1 parameterIndex是指的数据库表中第几个字段属性,他标记的是从1开始的,好比说一个表里边有两个字段属性(id,name)其中id是number类型,name是varchar2类型,那么设置的时候设置两个值就能够了,即:
state.setInt(1, count);//count为int类型
state.setString(2,str);//str为String类型数据库


而后说一下怎么解决上面这个异常的:
好比说要插入一个字段,我能够在sql语句里彻底写为空,好比说这个表里字段只有两个,一个number,一个clob,由于要存入超过4000个,因此只能使用clob类型了,固然也可使用long。我写一小段程序模拟一下:oracle

//数据库链接已完毕
PreparedStatement state=conn.prepareStatement("insert into test values(?,?)");
String str="";
for(int i=0;i<10000;++i)
{
       str+="abcdefghigklmnopqrstuvwxyz";
}
state.setInt(1,1);
state.setString(2,str);
state.execute();
//关闭全部链接

而后执行,能够成功插入
-----------------------------------------------------------------------------------------------------
以上是纠结了一天的问题,发现网上并无什么特别清晰的答案,因此既然偶然的成功了,那就把这种经验分享一下,但愿你们可以不吝赐教,有什么更好的办法,欢迎共享~
spa

相关文章
相关标签/搜索