2016-06-20 12 views
0

Ich habe die Anforderung, einen spezifischen Zeitstempel von Java in die Oracle-Datenbank einzufügen; Meine Oracle-Spalte ChangeTime ist von DATA_TYPE = TIMESTAMP (6) und erwartet einen Wert im Format - 08-APR-16 09.52.22.000000000 AM.ORA-01843: kein gültiger Monat -java zu sql Datumsumwandlung

Ich habe die java.sql.Timestamp bespannen in meinem Java-Code konvertiert:

String changeTimestamp = new Timestamp(System.currentTimeMillis()).toString(); 

und meine SQL PreparedStatement ist wie folgt:

<property name="updatePersonDetail"> 
     <bean class="com.cigna.ibor.dao.UpdateWithParameters" parent="dao.template"> 
      <constructor-arg ref="mydb.ds" /> 
      <constructor-arg> 
       <value> 
        <![CDATA[ 
UPDATE MYDB.INDIV_DETAIL 
SET PERSON_ID =? 
    , LAST_OPER_ID = ? 
    , LAST_TIMESTMP = ?, 

WHERE SRC_LOC_CD = ? 
    AND SRC_SYS_ID = ? 
        ]]> 
       </value> 
      </constructor-arg> 
      <constructor-arg> 
       <list> 
        <ref local="java.sql.Types.VARCHAR" /> 
        <ref local="java.sql.Types.VARCHAR" /> 
        <ref local="java.sql.Types.VARCHAR" /> 
        <ref local="java.sql.Types.VARCHAR" /> 
        <ref local="java.sql.Types.VARCHAR" /> 

       </list> 
      </constructor-arg> 
     </bean> 
    </property> 

ich java.sql bin immer. SQLDataException: ORA-01843: kein gültiger Monat beim Ausführen. Jede Hilfe wird geschätzt!

+2

sieht aus wie Sie versuchen, eine Zeichenfolge in einen Timestamp einzufügen – kevinsky

+0

Es wäre hilfreich, mehr Code und auch einige Debug-Ausgabe von wie Ihr Zeitstempel aussieht. – Adowrath

+0

@kevinsky: ja ... wie kann ich diese Zeichenfolge konvertieren, so dass mein Orakel keinen Fehler beim Aktualisieren wirft? – Bidisha

Antwort

0

Wenn Sie einen String formatiert haben wie 08-APR-16 09.52.22.000000000 AM dann können Sie das Format, anstatt sich auf die implizite Konvertierung angeben:

UPDATE MYDB.INDIV_DETAIL 
SET PERSON_ID =? 
    , LAST_OPER_ID = ? 
    , LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM'), 
WHERE SRC_LOC_CD = ? 
    AND SRC_SYS_ID = ? 

Das Format Modell übereinstimmen muss, was Sie vorbei tatsächlich. Es klingt, als ob Sie annehmen, dass dies die Einstellung NLS_TIMESTAMP_FORMAT der Sitzung ist, aber der Fehler deutet darauf hin, dass dies nicht der Fall ist. Verwechseln Sie nicht, wie Ihr Client/IDE einen abgefragten Datums-/Zeitstempel mit der Art der Speicherung anzeigt - es gibt kein eigenes Format, Oracle verwendet eine interne Darstellung, die nichts mit dem angezeigten Wert zu tun hat.

Auch damit gehen Sie davon aus, dass die Datensprache der Oracle-Session mit dem Java-Wert übereinstimmt - dass sie beispielsweise englische Monatsnamen verwenden. Wenn Sie nicht sicher sind, was das Datum Sprache des Datenbanksitzung, aber die Java-String weiß immer, Englisch ist, können Sie specify that in the conversion:

, LAST_TIMESTMP = TO_TIMESTAMP(?, 'DD-MON-RR HH:MI:SS.FF9 AM' 
     , 'NLS_DATE_LANGUAGE=ENGLISH'), 

Wenn Sie einen Java-Zeitstempel-Wert haben, sind aktuell sind es in eine Zeichenfolge in diesem Format zu konvertieren Um diesen Aufruf zu tätigen, können Sie ihn als Zeitstempel übergeben und nicht in und aus einer Zeichenfolge konvertieren.

Verwandte Themen