java.sql.SQLException: ORA-01461: è possibile associare un valore di tipo LONG solo per inserire in una LUNGA colonna

Sto utilizzando una semplice interfaccia (in jsf 1.2 e ricco di volti 3.3.2, Oracle 11g R1) per consentire all’utente di selezionare l’immagine con ricco:fileUpload e salvare in una tabella.
Come prova, ho creato la seguente tabella.

CREATE TABLE TEST
(
 MIME_TYPE VARCHAR2 (1000),
 PHOTO BLOB,
 STUDENT_ID NUMBER NOT NULL
)

snippet di codice per salvare l’immagine campo BLOB è come indicato di seguito.

//......From the uploadFile Listener
public void listener(UploadEvent event) throws Exception {
...      
item = event.getUploadItem();
...
StudentPhotoDAO dao = new StudentPhotoDAO();
dao.storePhoto(item.getData(),item.getContentType(),studentId);
...
}


//......From the PhotoDAO ..........................


public void storePhoto(byte data[],String mimeType, Long studentId){
{
 ...
  ByteArrayInputStream bis=new ByteArrayInputStream(data);
  String query = "update  TEST set PHOTO = ? ,MIME_TYPE = ?  where STUDENT_ID=?";
  pstmt = conn.prepareStatement(query);
  pstmt.setAsciiStream(1,(InputStream)bis,data.length);
  pstmt.setString(2,mimeType.toString());
  pstmt.setLong(3,studentId);
  pstmt.executeUpdate();
 }

Ottengo il seguente errore:

java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column

Dove è l’errore nel codice, per favore.

Grazie.

  • Sembra che il tipo SQL NUMERO non è compatibile con il Java di tipo Long.
  • In Oracle, LUNGA è un tipo testuale, non un tipo numerico. La maggior parte di queste risposte sono alla ricerca nei posti sbagliati.
InformationsquelleAutor learner | 2012-07-09

 

5 Replies
  1. 1

    Specificare il student_id come number, che sembra mappa per BigInteger. Si veda, ad esempio in questa tabella.

    Sia la fornitura di un BigInteger o hai bisogno di cambiare il tipo di student_id.

    • Grazie per la risposta. ho fatto la conversione student_id per BigInteger. ma come si mappa per preparedStatement argomento. poiché non vi è alcuna pstmt.setBigInteger metodo…
    • Usato questo, ma stesso errore BigInteger bi = BigInteger.valueOf(studentId.longValue()); String query = “Update SET di TEST in FOTO = ? , Tipo mime = ? dove STUDENT_ID=” + bi + “”;
    • Tenta di impostare utilizzando setObject() invece
    • sir si può mettere un po ‘ di codice come utilizzare setObject() (i m un principiante qui)
  2. 1

    Guardare Oracle LUNGO tipo descrizione:
    “LUNGA è un tipo di dati Oracle per la memorizzazione di dati di carattere …”. Così a LUNGO non è il numero in Oracle. Si tratta di un testo.

    Penso che hai avuto questo errore a causa di questo:
    pstmt.setAsciiStream(1,(InputStream)bis,data.length);

    Tenta di utilizzare pstmt.setBinaryStream(int, InputStream, int) o pstmt.setBinaryStream(int, InputStream, long).

    • pstmt.setBinaryStream(int, InputStream, int), getta la stessa eccezione quando i dati sono più di 4000 byte
    • href=”http://sscce.org/” >sscce prove plz. Non riesco a riprodurlo nel mio test.
  3. 0

    Si chiama

    pstmt.setLong(3,studentId);

    e colonna specificata come

    STUDENT_ID NUMBER NOT NULL

    e come docs dice:

    È stato effettuato un tentativo di inserire un valore da una LUNGA tipo di dati in
    un altro tipo di dati. Questo non è consentito.

    Quindi basta fare così:

    STUDENT_ID INTEGER NOT NULL
    pstmt.setInt(3, studentId);
    • cant cambiato la colonna dal NUMERO. (i suoi costrizione che posso dire, ma poi ho ll ve a *mal di te 😉 ).
    • L’INTERO oracle tipo di dati è equivalente al NUMERO(28)
    • Oracle LONG tipo di un tipo di dati carattere. Qui il problema è legato al primo valore di binding, non il terzo…
  4. 0

    In caso di associazione di grandi flussi binari di una colonna BLOB in Oracle, utilizzare PreparedStatement.setBlob() piuttosto che setAsciiStream() o setBinaryStream().

  5. 0

    Credo che utilizzando ASCII stream è la colpa.

    pstmt.setAsciiStream(1, (InputStream) bis, data.length);

    Provare

    pstmt.setBinaryStream(1, new ByteArrayInputStream(data));

    (Sembra che Oracle interpreta ASCII stream con parametri di lunghezza il tempo che non può essere più di 4000 byte. Ma questo è solo un non confermati a indovinare).

Lascia un commento