Posted on 2005-11-13 00:01
Terry的Blog 閱讀(1767)
評論(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就放在堆內存。