天天看点

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')