0

DB への挿入中にこの例外が発生します。トレースを添付しました。

原因: java.sql.SQLException: oracle.jdbc.driver.OraclePreparedStatement.setTimestampInternal(OraclePreparedStatement.java:7256) の無効な列インデックス
oracle.jdbc.driver.OraclePreparedStatement.setTimestamp( OraclePreparedStatement.java:7240
) org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setTimestamp(WrappedPreparedStatement.java:554) の
.driver.OraclePreparedStatementWrapper.setTimestamp(OraclePreparedStatementWrapper.java:302 )

私のクエリは

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]

LST_UPT_TS である 14 番目のインデックスでこの例外が発生します。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_DATEに、2つのTIMESTAMP列に使用しています。CURRENT_TIMESTAMP精度が必要な場合は、代わりに使用できます。そして、その背後にある考え方to_date(to_char(sysdate,...),...)が時間の部分を失うことである場合は、trunc(sysdate)代わりにそれをより明確で単純にするために使用できます。

ただし、これらは当面の問題を引き起こしていません。12/31/2099魔法の日付として使用することには、もっと問題があります。それはいつか誰かに頭痛の種を引き起こすでしょう、そして起こるのを待っているY2Kの繰り返しのように見えます。(もちろん、問題になる前に私たち全員が引退することを願っていますが、それでも...)

于 2012-08-17T13:57:52.677 に答える
0

CURRENT_DATE は、タイムスタンプではなく日付データ型です。ただし、自由に変換できる必要があります。

パラメータがクエリ内でどのように並んでいるかについて、私は少し困惑してい?ます。システムの組み込み値を使用して値を入力しているときに、データ値を渡すのはなぜですか?

いずれにせよFri Aug 17 10:59:24 IST 2012、Oracle のデフォルト形式ではありません。したがって、NLS 設定が異なる場合を除き、明示的なフォーマット マスクを含める必要があります。

そして、sysdate を使用した TO_DATE(TO_CHAR()) フープラは必要ありません。すべての日付は、Oracle の標準形式で格納されます。マスクは、入力または出力をフォーマットするためだけのものです。

于 2012-08-17T08:08:43.277 に答える