Ottenere un’eccezione ORA-00942: tabella o vista non esiste – quando si inserisce in una tabella esistente

Sto ottenendo sotto eccezione, quando si tenta di inserire un lotto di righe in una tabella esistente

ORA-00942: tabella o vista non esiste

Posso confermare che la tabella esiste in db e posso inserire dati in quella tabella usando lo sviluppatore di Oracle sql. Ma quando provo ad inserire righe usando preparedstatement in java, la sua tabella di lancio non esiste errore.

Si prega di trovare la traccia di errore di stack qui sotto

java.sql.SQLException: ORA-00942: table or view does not exist at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093) at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589) at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591) at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 

Qualcuno può suggerire i motivi di questo errore?

Aggiornamento: problema risolto

Non c’era alcun problema con le mie proprietà di connessione al database o con la mia tabella o il nome della vista. La soluzione al problema era molto strana. Una delle colonne che stavo cercando di inserire era di tipo Clob. Dato che ho avuto un sacco di problemi nel gestire i dati di clob in oracle db, ho provato a sostituire il clob setter con un setter di stringa temporaneo e lo stesso codice è stato eseguito senza problemi e tutte le righe sono state inserite correttamente !!!.

vale a dire. peparedstatement.setClob (columnIndex, clob)

è stato sostituito con

peparedstatement.setString (columnIndex, “String”)

Perché esiste una tabella errori o una vista, l’errore è stato generato per errore nell’inserimento dei dati di clob. Qualcuno di voi potrebbe spiegare, per favore?

Grazie mille per le tue risposte e commenti.

Oracle segnalerà questo errore anche se la tabella esiste, ma non hai privilegi su di essa. Quindi se sei sicuro che il tavolo è lì, controlla le sovvenzioni.

Sembra esserci qualche problema con setCLOB () che causa un ORA-00942 in alcune circostanze quando la tabella di destinazione esiste ed è correttamente privilegiata. Ora sto avendo questo problema esatto, posso far sparire l’ORA-00942 semplicemente non legando il CLOB alla stessa tabella.

Ho provato setClob () con un java.sql.Clob e setCLOB () con un oracle.jdbc.CLOB ma con lo stesso risultato.

Come dici tu, se ti leghi come una stringa il problema scompare, ma questo limita la dimensione dei tuoi dati a 4k.

Dal test sembra essere triggersto quando una transazione è aperta sulla sessione prima di bind il CLOB. Mi riprenderò quando avrò risolto questo … controllando il supporto Oracle.

Non c’era alcun problema con le mie proprietà di connessione al database o con la mia tabella o il nome della vista. La soluzione al problema era molto strana. Una delle colonne che stavo cercando di inserire era di tipo Clob. Dato che ho avuto un sacco di problemi nel gestire i dati di clob in oracle db, ho provato a sostituire il clob setter con un setter di stringa temporaneo e lo stesso codice è stato eseguito senza problemi e tutte le righe sono state inserite correttamente !!!.

vale a dire. peparedstatement.setClob (columnIndex, clob)

è stato sostituito con

peparedstatement.setString (columnIndex, “String”)

@unbeli ha ragione. Se non si concedono sovvenzioni adeguate su un tavolo, si verificherà questo errore. Per quello che vale, l’ho sperimentato di recente. Stavo sperimentando il problema esatto che hai descritto, potevo eseguire istruzioni di inserimento tramite lo sviluppatore sql ma fallirebbero quando si usava l’ibernazione. Ho finalmente capito che il mio codice stava facendo più dell’ovvio inserto. Inserimento in altre tabelle che non hanno ricevuto sovvenzioni appropriate. La modifica dei privilegi di sovvenzione ha risolto questo problema per me.

Nota: non avere la reputazione di commentare, altrimenti questo potrebbe essere stato un commento.

Ho trovato come risolvere questo problema senza utilizzare il metodo setString () di JDBC che limita i dati a 4K.

Quello che devi fare è usare preparedStatement.setClob (int parameterIndex, Reader reader). Almeno questo è quello che ha funzionato per me. I driver Oracle di Thought converte i dati nello stream di caratteri da inserire, sembra che no. O qualcosa di specifico che causa un errore.

Usare un personaggio sembra funzionare per me. Sto leggendo le tabelle da un db e scrivendo ad un altro usando jdbc. E stavo ottenendo errore di tabella non trovato proprio come è menzionato sopra. Ecco come ho risolto il problema:

 case Types.CLOB: //Using a switch statement for all columns, this is for CLOB columns Clob clobData = resultSet.getClob(columnIndex); // The source db if (clobData != null) { preparedStatement.setClob(columnIndex, clobData.getCharacterStream()); } else { preparedStatement.setClob(columnIndex, clobData); } clobData = null; return; 

Tutto bene ora.

Abbiamo riscontrato questo problema su una colonna BLOB. Nel caso in cui qualcun altro cada su questa domanda quando si verifica questo errore, ecco come abbiamo risolto il problema:

Abbiamo iniziato con questo:

  preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break; 

Abbiamo risolto il problema cambiando la linea in questo modo:

  java.sql.Blob blob = resultSet.getBlob(columnName); if (blob != null) { java.io.InputStream blobData = blob.getBinaryStream(); preparedStatement.setBinaryStream(parameterIndex, blobData); } else { preparedStatement.setBinaryStream(parameterIndex, null); } 

Il tuo script fornisce il nome dello schema o ti affidi all’utente connesso al database per selezionare lo schema predefinito ?

Potrebbe essere che non si nomina lo schema e che si esegua il batch con un utente di sistema anziché con lo utente dello schema risultante nel contesto di esecuzione errato per uno script che funzionerebbe correttamente se eseguito dall’utente con lo schema di destinazione impostato come schema di default. L’azione migliore sarebbe includere il nome dello schema nelle istruzioni di inserimento:

 INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue') 

aggiornamento: cerchi di associare il nome della tabella come valore associato alla tua istruzione preparata? Quello non funzionerà.

Per me funziona:

 Clob clob1; while (rs.next()) { rs.setString(1, rs.getString("FIELD_1")); clob1 = rs.getClob("CLOB1"); if (clob1 != null) { sta.setClob(2, clob1.getCharacterStream()); } else { sta.setClob(2, clob1); } clob1 = null; sta.setString(3, rs.getString("FIELD_3")); } 

Qui ho trovato la soluzione per la domanda. Il problema è sul pesce di vetro se lo stai usando. Quando si crea il nome JNDI assicurarsi che il nome del pool sia corretto e il nome del pool è il nome del nome del pool di connessione che si è creato.

inserisci la descrizione dell'immagine qui