Posted on 2005-11-13 00:01
Terry的Blog 閱讀(1767)
評論(0) 編輯 收藏 所屬分類:
oracle
JDBC更新長VARCHAR2字段
oracle8開始VARCHAR2字段最大長度達到了4000.但是我們并不能簡單的用jdbc輸入這么大的字符串。
讓我們看看以下的情況:
數(shù)據(jù)庫參數(shù) NLS Database Parameters:
NLS_CHARACTERSET JA16SJIS
NLS_NCHAR_CHARACTERSET AL16UTF16
如果用pstmt.setString(index, value)更新一個字段; value是1000個日文字符 那么我們回得到出錯信息:
java.sql.SQLException: データ?サイズがこの型の最大サイズを超えています。: 3000
出錯信息表示oracle認(rèn)為你輸入了3000長度的字符。
經(jīng)過幾次實驗可以發(fā)現(xiàn)pstmt.setString(index, value)只能更新長度<=2000的字段。
(原因不明 和oracle7時VARCHAR2字段最長為2000有關(guān)?)
長度的計算方法:(英文字母和數(shù)字的數(shù)量+日文字符的數(shù)量*3)<=2000
比如“123パラメータ”的長度是18
更新較長的varchar2字段時應(yīng)該用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() 的使用比較復(fù)雜, Oracle網(wǎng)站上還介紹了一種解決辦法:用兩個參數(shù)對應(yīng)一個字段
比如emp表中有一個字段memo
insert into emp(memo) values (?||?); 只要保證給每個參數(shù)賦的值不超過限制長度即可.
題外話:
2000對于oracle PL/SQL中的VARCHAR2變量來說是比較特殊的是數(shù)字。
定義一個小于2000的VARCHAR2變量,那么oracle就把它放在棧內(nèi)存 如果大于2000就放在堆內(nèi)存。