2012-08-17 91 views
0

我在插入數據庫時​​遇到此異常。 附上痕跡。插入數據庫時​​列索引異常無效

產生的原因:在oracle.jdbc.driver.OraclePreparedStatement.setTimestamp(OraclePreparedStatement在oracle.jdbc.driver.OraclePreparedStatement.setTimestampInternal(OraclePreparedStatement.java:7256)
無效的列索引
:java.sql.SQLException中。的java:7240)
在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 
,?) 

而PARAMS作爲如下

[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此列的分貝的數據類型是SYSTIMESSTAMP。

降序SP_OPS_TEAM 名稱null類型


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)

任何幫助,將理解

+0

Lemme接受一個答案我得到一個這個@alfasin – 2012-08-17 06:30:01

+0

你的錯誤satck提到'setTimestamp()'但它不是清楚你在代碼中使用它的位置。 – APC 2012-08-17 09:09:29

+0

您顯示爲Java的參數是否正在報告它們;你有沒有用日期代替?你可以顯示你正在使用的準備語句的Java代碼並設置所有參數嗎? – 2012-08-17 13:40:06

回答

0

你說你是「第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的重複。 (當然,我們都希望退休之前,它成爲一個問題,但仍然...)

0

CURREN T_DATE是date datatype不是時間戳。但是,他們應該可以自由兌換。

對於您的參數如何與您的查詢中的?對齊,我有點困惑。爲什麼在使用系統內置值來填充它們時傳遞數據值?

無論如何Fri Aug 17 10:59:24 IST 2012不是Oracle的默認格式之一。所以除非你的NLS設置不同,否則你需要包含一個明確的格式掩碼。

而且您不需要使用sysdate TO_DATE(TO_CHAR())hoopla。所有日期均以Oracle的規範格式存儲:掩碼僅用於格式化輸入或輸出。

+0

你能告訴我需要改正嗎? – 2012-08-17 08:15:24

相關問題