提交字符数长度在[1000,2000]即字符数长度在1000到2000之间的时候报:关于“ora-01483:DATE或NUMBER赋值变量的长度无效”的问题

来源:互联网 发布:素书 知乎 编辑:程序博客网 时间:2024/06/10 03:19

       在看这篇文章之前可以先看看我以前所写的一篇《关于“ora-01483:DATE或NUMBER赋值变量的长度无效”的问题》

      本以为那个方法已经解决了问题,没想到这只是解决了半边问题,使长度超过2000字符数的时候就不会报错,但是今天突然发现当字符数在1000-2000之间也包括1000和2000个字符数的时候依然会报错。

      我该想openeditor说对不起,不是你不够好,而是我的错。本以为openeditor文本编辑器插入表格就报:ora-01483:DATE或NUMBER赋值变量的长度无效,是它本身的控件问题,现在才知原来是今天所讨论的问题。

      后来到网上查了一下,发现也有前辈们遇到过此问题,参考前辈们留下的经验

      解决思路是:当提交字段长度在1001至2000时,添加空格增加长度,这样就不会报错。 当取出来显示时就用trim就OK了。

      转换方法:

 /**
  * 当字符串长度在1000-2000之间的时候补空格
  * @param str
  * @return
  */
 public   String   translate(String   str)  
 {  
    if(null==str){
     return "";
    }
    if(str.length()>2000||str.length()<1000)return   str;  
    char[] c = new char[2001];  
    Arrays.fill(c,' ');  
    char[] cs = str.toCharArray();  
     
    System.arraycopy(cs,0,c,0,cs.length);  
    return new String(c,0,c.length);  
  }
注意 char[] c = new char[2001];   这里至少为2001,而不能初始化为2000,测试的时候发现当设为2000依然会报错。


好了,测试一下吧。

 

 

当然网上我还看到朋友是遇到这样的问题:

转:http://www.blogjava.net/liuspring/archive/2008/08/26/224760.html

  报错代码:

  用字符流插入就行了

    PreparedStatement pst = conn.prepareStatement("insert into table(name,book) values(?,?)");
    pst.setString(1, "spring");

    pst.setCharacterStream(2, new InputStreamReader(new ByteArrayInputStream(s.getBytes())), s.length());
    pst.execute();

    这样可以正常插入。

    高兴...

    可是好景不长,修改也用如此方法改之,记过又报错: java.sql.SQLException: ORA-01483: DATE 或 NUMBER 赋值变量的长度无效

     我晕,在我本地机子上tomcat环境下运行是没有这种错误的,而部署到服务器上,服务器上是weblogic,就报这样的错误,修改失败,而 insert就没有错误,而且如果修改字符数较小的就能修改成功,如果修改较大的就会报错,之后不管修改什么样的,都会报错,闹鬼了,纳闷了,这是什么错 误啊,接着在网上查,高手建议把一个字符拆成两个代入

    改成下面这样子

        int length=book.length();
        String s1="";
        String s2="";
        if(length>1000){
            s1=book.substring(0,1000);
            s2=book.substring(1000,length);
        }else{
            s1=book;
           
        }

         pstmt = conn.prepareStatement("update table set book=?||? "+
                                        "where name=?");
       pstmt.setString(1, s1);
       pstmt.setString(2, s2);
       pstmt.setInt(3, “spring”);

    结果就成功了,嘿嘿,原来还有这种方法,这是oracle特有的么?呵呵对oracle不熟悉

其实这主要原因是 pstmt.setString方法限制了字符串的长度

原创粉丝点击