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

          JDBC更新長VARCHAR2字段

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

          主站蜘蛛池模板: 江陵县| 德江县| 定安县| 当阳市| 绿春县| 咸阳市| 府谷县| 北海市| 龙州县| 新建县| 专栏| 衡东县| 镇赉县| 垣曲县| 江北区| 常山县| 晴隆县| 太仓市| 揭阳市| 车致| 茌平县| 南木林县| 仙居县| 重庆市| 库车县| 正镶白旗| 东源县| 梧州市| 湟中县| 临潭县| 邮箱| 康保县| 根河市| 广平县| 呼图壁县| 城固县| 上蔡县| 尼木县| 湖州市| 屏边| 潢川县|