天天看點

ofbiz ORA-01843: 無效的月份錯誤 ORA-01843: not a valid month while using oracle database

    在opentanps轉oracle的時候發現出現了無效的月份錯誤“ORA-01843: not a valid month while using oracle database”

網上找了很多解決方案大至都是在資料庫加觸發器官方的解決方法也是加觸發器,  create or replace TRIGGER ON_CONNECT AFTER LOGON ON DATABASE     DECLARE     guser varchar2(30);      begin     SELECT sys_context('USERENV','SESSION_USER') into guser FROM dual;     if (guser='ofbiz' or guser='OFBIZ') THEN     EXECUTE IMMEDIATE 'alter session set nls_timestamp_format = ''YYYY-MM-DD HH24:MI:SS.FF''';     end if;      end;     這方法試了N次都不起作用。這種方法加觸發器考慮到對性能的影響。最後還是決定找底層出錯的代碼段進行修改  “opentaps-1.4/framework/entity/src/org/ofbiz/entity/jdbc”的 SqlJdbcUtil.java檔案 找到方法:  public static void addValueSingle(StringBuilder buffer, ModelField field, Object value, List<EntityConditionParam> params) {         if (field != null) {             buffer.append('?');         }          else {             buffer.append('/'');             if (value instanceof String) {                 buffer.append(((String) value).replaceAll("'", "''"));             } else {                 buffer.append(value);             }             buffer.append('/'');         }         if (field != null && params != null) params.add(new EntityConditionParam(field, value));     }     修改為:  public static void addValueSingle(StringBuilder buffer, ModelField field, Object value, List<EntityConditionParam> params) {         if (field != null) {             buffer.append('?');         } else if(value instanceof Timestamp){          buffer.append("to_timestamp('");          buffer.append(value);          buffer.append("','yyyy-MM-dd HH24:mi:ssxff')");         }         else {             buffer.append('/'');             if (value instanceof String) {                 buffer.append(((String) value).replaceAll("'", "''"));             } else {                 buffer.append(value);             }             buffer.append('/'');         }         if (field != null && params != null) params.add(new EntityConditionParam(field, value));     }     解決方法就是在轉入sql語句中 把日期的字元串"2011-01-17T16:10:26.000+0800"轉格式 to_timestamp('2011-01-17T16:10:26.000+0800','yyyy-MM-dd HH24:mi:ssxff')