posts - 56, comments - 54, trackbacks - 0, articles - 4
   ::  ::  :: 联系 :: 聚合  :: 管理

JDBC更新长VARCHAR2字段

Posted on 2005-11-13 00:01 Terry的Blog 阅读(1733) 评论(0)  编辑  收藏 所属分类: oracle

JDBC更新长VARCHAR2字段

oracle8开始VARCHAR2字段最大长度达到了4000.但是我们并不能简单的用jdbc输入这么大的字符串。
让我们看看以下的情况:
数据库参数 NLS Database Parameters:
NLS_CHARACTERSET                          JA16SJIS
NLS_NCHAR_CHARACTERSET         AL16UTF16

如果用pstmt.setString(index, value)更新一个字段; value是1000个日文字符 那么我们回得到出错信息:
java.sql.SQLException: データ・サイズがこの型の最大サイズを超えています。: 3000
出错信息表示oracle认为你输入了3000长度的字符。
经过几次实验可以发现pstmt.setString(index, value)只能更新长度<=2000的字段。
(原因不明 和oracle7时VARCHAR2字段最长为2000有关?)
长度的计算方法:(英文字母和数字的数量+日文字符的数量*3)<=2000
比如“123パラメータ”的长度是18
   
更新较长的varchar2字段时应该用pstmt.setCharacterStream(...)
且一次只能更新一个长varchar2字段。

    private void updateChar(Connection conn,int index) throws SQLException{
      
        String SQL = " UPDATE KMD_DOWNLOADRRK_T SET OUTPUTQUERY = ? " +
                    " WHERE RRKCD = ?";
        PreparedStatement pstmt = null;
        try{
            pstmt=conn.prepareStatement(SQL);
            //パラメータのセット
            String query = "length must <= 2000";
            StringReader read = new StringReader(query);
            pstmt.setCharacterStream(1,read,query.length());
            pstmt.setString(2, "001");
            pstmt.executeUpdate();
        }finally{
            if(pstmt != null) pstmt.close();
        }
    }

setCharacterStream() 的使用比较复杂, Oracle网站上还介绍了一种解决办法:用两个参数对应一个字段
比如emp表中有一个字段memo
insert into emp(memo) values (?||?);
只要保证给每个参数赋的值不超过限制长度即可.

题外话:
2000对于oracle PL/SQL中的VARCHAR2变量来说是比较特殊的是数字。
定义一个小于2000的VARCHAR2变量,那么oracle就把它放在栈内存 如果大于2000就放在堆内存。


只有注册用户登录后才能发表评论。


网站导航: