Posted on 2005-11-13 00:01
Terry的Blog 阅读(1752)
评论(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就放在堆内存。