插入数据库时​​列索引异常无效

时间:2012-08-17 06:09:51

标签: oracle

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

引起:java.sql.SQLException:列索引无效     at oracle.jdbc.driver.OraclePreparedStatement.setTimestampInternal(OraclePreparedStatement.java:7256)
    在oracle.jdbc.driver.OraclePreparedStatement.setTimestamp(OraclePreparedStatement.java:7240)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setTimestamp(OraclePreparedStatementWrapper.java:302)
    在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)        

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

你说你'在第14个索引'得到这个例外',它似乎来自stmt.setTimestamp(14, ...)。您正在插入15列,但只有11个位置参数(?),其他4个在查询中设置 - 使用to_date()CURRENT_DATE子句。所以,14确实不会成为一个有效的索引,你会得到11以上的任何错误,你可能会遇到一些数据转换问题。

根据您展示的内容,您无需尝试设置任何日期/时间戳值,因此您根本不应进行任何stmt.setDate()stmt.setTimestamp()来电。

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

但这些并没有造成任何直接问题。使用12/31/2099作为魔法日期我遇到了更多问题;那会让某人头疼一天,看起来像Y2K的重复等待发生。 (当然,我们都希望在成为问题之前退休,但仍然......)

答案 1 :(得分:0)

CURRENT_DATE是date datatype而不是时间戳。但是,它们应该是可以自由兑换的。

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

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

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