第一次发帖试水 斯密达。
最近项目中需要完成通过字符串解析出表中的数据,然后插入表的功能。
解析没有问题,但是如果是空字符,就会出现错误。
sql是这样的:INSERT INTO SUBS_RATEPLAN (KEY_ID, PRODUCT_ID, PACKAGE_ID, GROUP_ID, AVAILTIME, EXPIRETIME, OID) VALUES (?,?, ?, ?, TO_DATE(?, 'YYYYMMDDHH24MISS'), TO_DATE(?, 'YYYYMMDDHH24MISS'),?)
如果字段为空,报错:
java.sql.SQLException: [TimesTen][TimesTen 11.2.1.9.7 ODBC Driver]Error in assignment
at com.timesten.jdbc.JdbcOdbc.createSQLException(JdbcOdbc.java:3232)
at com.timesten.jdbc.JdbcOdbc.standardError(JdbcOdbc.java:3381)
at com.timesten.jdbc.JdbcOdbc.standardError(JdbcOdbc.java:3346)
at com.timesten.jdbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:871)
at com.timesten.jdbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:361)
at com.huawei.refresh.process.MemoryDataBaseProc.insertData(Unknown Source)+
大体原因应该是,有的字段是数据类型,驱动包中做数据转换时,空串不知道转换成什么数字,所以报错啦。
解决办法是:把绑定变量改成to_number(cast ? as varchar2(20)),这样告诉驱动包绑定变量都是字符类型,就不会报错了
数据类型的搞定了,字符类型的又出问题了:
如果表中字段为空,where条件中用PACKAGE_ID=?绑定变量,然后传个空串过去是匹配不到的,因此需要对空时设定默认条件 可以这样修改nvl(PACKAGE_ID,‘null’)=nvl(?,‘null’) 这样就可避免了,反正为空的字段肯定不为主键,只要主键匹配上了,其他字段肯定是一致的,设置个默认值也没有关系
搞定!
不知道大家能看懂没