0

我在插入数据库时​​遇到了这个异常。已附上痕迹。

引起:java.sql.SQLException:
在 oracle.jdbc.driver.OraclePreparedStatement.setTimestamp(OraclePreparedStatement.java:7240) 的
oracle.jdbc.driver.OraclePreparedStatement.setTimestampInternal(OraclePreparedStatement.java:7256)的列索引无效。
.driver.OraclePreparedStatementWrapper.setTimestamp(OraclePreparedStatementWrapper.java:302)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setTimestamp(WrappedPreparedStatement.java:554)

我的查询是

INSERT INTO SP_OPS_TEAM(
PERSON_ID
,FROM_DT
,THRU_DT
,REPORTS_TO
,CASE_MAX_ALLOWED
,PAY_AUTH_MAX
,LUMP_SUM_MAX,DAYS_MAX
,HAS_DENIAL_AUTH_IND
,HAS_MEDICAL_AUTH_IND
,OPS_PERS_TYPE_CD
,CR_TS
,CR_USER
,LST_UPDT_TS
,LST_UPDT_USER) 
VALUES (
?
,to_date(to_char(sysdate,'yyyy/MM/dd'),'yyyy/MM/dd')
,to_date('12/31/2099','MM/DD/YYYY')
,?
,?
,?
,?
,?
,?
,?
,?
,CURRENT_DATE
,?
,CURRENT_DATE
,?)

参数如下

[6804
, Fri Aug 17 10:59:24 IST 2012
, Fri Aug 17 10:59:24 IST 2012
, 6803
, null
, null
, null
, null
, N
, N
, TM
, Fri Aug 17 10:59:24 IST 2012
, 6803
, Fri Aug 17 10:59:24 IST 2012
, 6803]

我在第 14 个索引 LST_UPT_TS 处遇到此异常,db 中此列的数据类型是 SYSTIMESSTAMP。

desc SP_OPS_TEAM
Name                 Null     Type              
-------------------- -------- ----------------- 
PERSON_ID            NOT NULL NUMBER            
FROM_DT              NOT NULL DATE              
THRU_DT              NOT NULL DATE              
REPORTS_TO           NOT NULL NUMBER(22)        
CASE_MAX_ALLOWED              NUMBER(5)         
PAY_AUTH_MAX                  NUMBER(10,4)      
LUMP_SUM_MAX                  NUMBER(10,4)      
DAYS_MAX                      NUMBER(5)         
HAS_DENIAL_AUTH_IND  NOT NULL CHAR(1 CHAR)      
HAS_MEDICAL_AUTH_IND NOT NULL CHAR(1 CHAR)      
OPS_PERS_TYPE_CD     NOT NULL VARCHAR2(25 CHAR) 
CR_TS                NOT NULL TIMESTAMP(6)      
CR_USER              NOT NULL NUMBER(22)        
LST_UPDT_TS          NOT NULL TIMESTAMP(6)      
LST_UPDT_USER        NOT NULL NUMBER(22)        

任何帮助,将不胜感激

4

2 回答 2

1

你说你'在第 14 个索引处得到这个异常',它似乎来自类似stmt.setTimestamp(14, ...). 您要插入 15 列,但只有 11 个位置参数 ( ?),另外 4 个是在查询中设置的 - 使用to_date()andCURRENT_DATE子句。所以,14 确实不是一个有效的索引,超过 11 的任何东西都会出现该错误,并且您可能会遇到与其他人的一些数据转换问题。

根据您显示的内容,您不需要尝试设置任何日期/时间戳值,因此您根本不应该有任何stmt.setDate()stmt.setTimestamp()调用。

此外,正如 APC 指出的那样,您正在使用CURRENT_DATETIMESTAMP列;CURRENT_TIMESTAMP如果您需要精度,您可以改用。如果背后的想法to_date(to_char(sysdate,...),...)只是失去时间部分,您可以使用trunc(sysdate)它来使其更清晰和更简单。

不过,这些并没有引起任何直接的问题。12/31/2099我对用作魔术约会有更多的问题;这总有一天会让人头疼,看起来就像千年虫的重复等待发生。(当然,我们都希望在它成为问题之前退休,但仍然......)

于 2012-08-17T13:57:52.677 回答
0

CURRENT_DATE 是日期数据类型而不是时间戳。但是,它们应该可以自由转换。

我对您的参数如何与?您的查询中的一致感到有点困惑。为什么在使用系统内置值填充数据值时要传递数据值?

无论如何Fri Aug 17 10:59:24 IST 2012,它不是 Oracle 的默认格式之一。因此,除非您的 NLS 设置不同,否则您将需要包含显式格式掩码。

而且您不需要带有 sysdate 的 TO_DATE(TO_CHAR()) hoopla。所有日期都以 Oracle 的规范格式存储:掩码仅用于格式化输入或输出。

于 2012-08-17T08:08:43.277 回答