it-swarm.com.de

Ausnahme erhalten ORA-00942: Tabelle oder Sicht ist nicht vorhanden - beim Einfügen in eine vorhandene Tabelle

Ich bekomme eine Ausnahme, wenn ich versuche, einen Stapel von Zeilen in eine vorhandene Tabelle einzufügen

ORA-00942: Tabelle oder Ansicht ist nicht vorhanden 

Ich kann bestätigen, dass die Tabelle in db vorhanden ist, und ich kann mit Oracle Sql developer Daten in diese Tabelle einfügen. Wenn ich jedoch versuche, Zeilen mithilfe von preparestatement in Java einzufügen, liegt keine Fehlermeldung vor.

Nachfolgend finden Sie die Stack-Ablaufverfolgung

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) 

Kann jemand die Gründe für diesen Fehler vorschlagen?

Update: Problem gelöst

Es gab kein Problem mit meinen Datenbankverbindungseigenschaften oder mit meinem Tabellen- oder Ansichtsnamen. Die Lösung des Problems war sehr seltsam. Eine der Spalten, die ich einfügte, war vom Typ Clob. Da ich zuvor in Oracle db eine Menge Probleme beim Umgang mit clob-Daten hatte, versuchte ich, den Clob-Setter durch einen temporären String-Setter zu ersetzen und denselben Code ohne Probleme auszuführen, und alle Zeilen wurden korrekt eingefügt.

dh. peparedstatement.setClob (columnIndex, clob)

wurde durch ersetzt

peparedstatement.setString (columnIndex, "String")

Warum eine Fehlertabelle oder -ansicht vorhanden ist, wurde ein Fehler beim Einfügen von Clob-Daten ausgegeben. Könnte jemand von euch bitte erklären?

Vielen Dank für Ihre Antworten und Kommentare.

13
aquero

Es gab kein Problem mit meinen Datenbankverbindungseigenschaften oder mit meinem Tabellen- oder Ansichtsnamen. Die Lösung des Problems war sehr seltsam. Eine der Spalten, die ich einfügte, war vom Typ Clob. Da ich zuvor in Oracle db eine Menge Probleme beim Umgang mit clob-Daten hatte, versuchte ich, den Clob-Setter durch einen temporären String-Setter zu ersetzen und denselben Code ohne Probleme auszuführen, und alle Zeilen wurden korrekt eingefügt.

dh. peparedstatement.setClob (columnIndex, clob)

wurde durch ersetzt

peparedstatement.setString (columnIndex, "String")

8
aquero

Oracle meldet diesen Fehler auch, wenn die Tabelle vorhanden ist, Sie haben jedoch keine Berechtigungen. Wenn Sie sich also sicher sind, dass der Tisch vorhanden ist, überprüfen Sie die Zuschüsse.

13
unbeli

Es scheint ein Problem mit setCLOB () zu geben, das unter bestimmten Umständen zu einem ORA-00942 führt, wenn die Zieltabelle vorhanden ist und über die richtigen Berechtigungen verfügt. Ich habe jetzt genau dieses Problem. Ich kann den ORA-00942 zum Verschwinden bringen, indem der CLOB einfach nicht in dieselbe Tabelle eingebunden wird.

Ich habe setClob () mit einem Java.sql.Clob und setCLOB () mit einem Oracle.jdbc.CLOB versucht, aber mit dem gleichen Ergebnis.

Wie Sie sagen, wenn Sie als Zeichenfolge binden, wird das Problem behoben. Dies beschränkt jedoch Ihre Datengröße auf 4 KB.

Beim Testen scheint es ausgelöst zu werden, wenn vor dem Binden des CLOB eine Transaktion in der Sitzung geöffnet ist. Ich werde mich melden, wenn ich das gelöst habe ... und die Oracle-Unterstützung überprüfen.

10
Adrian

@unbeli hat recht. Wenn keine geeigneten Zuweisungen für eine Tabelle vorhanden sind, führt dies zu diesem Fehler. Für das, was es wert ist, habe ich dies kürzlich erlebt. Ich hatte genau das Problem, das Sie beschrieben haben. Ich konnte Einfügeanweisungen über SQL-Entwickler ausführen, würde jedoch bei Verwendung des Ruhezustands fehlschlagen. Ich stellte schließlich fest, dass mein Code mehr tat als die offensichtliche Einfügung. Einfügen in andere Tabellen, für die es keine geeigneten Zuschüsse gab. Durch das Anpassen der Grant-Privilegien wurde dies für mich gelöst.

Hinweis: Haben Sie keinen guten Ruf, einen Kommentar abzugeben, ansonsten könnte dies ein Kommentar sein.

3
Jonathan Dixon

Ich habe gefunden, wie man dieses Problem lösen kann, ohne die setString () - Methode von JDBC zu verwenden, die die Daten auf 4 KB beschränkt.

Was Sie tun müssen, ist die Verwendung von preparStatement.setClob (int parameterIndex, Reader reader). Zumindest hat das bei mir funktioniert. Die Oracle-Treiber konvertieren Daten in einen Zeichenstrom, um eingefügt zu werden. Oder etwas bestimmtes, das einen Fehler verursacht. 

Die Verwendung eines characterStream scheint für mich zu funktionieren. Ich lese Tabellen von einer Datenbank und schreibe mit jdbc in eine andere. Und ich bekam immer eine Fehlermeldung, wie es oben erwähnt wurde. So habe ich das Problem gelöst:

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;

Alles gut jetzt.

2
Bren

Wir haben dieses Problem in einer BLOB-Kolumne erlebt. Für den Fall, dass jemand anderes auf diese Frage stößt, wenn dieser Fehler auftritt, haben wir das Problem so gelöst:

Wir haben damit angefangen:

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

Wir haben das Problem gelöst, indem wir diese Zeile folgendermaßen geändert haben:

        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);
        }
2
diadyne

Bietet Ihr Skript den Schemanamen , oder verlassen Sie sich auf den in der Datenbank angemeldeten Benutzer, um das Standardschema auszuwählen? 

Es kann sein, dass Sie das Schema nicht benennen und dass Sie den Batch mit einem Systembenutzer anstelle des Schemabenutzers ausführen, was zu einem falschen Ausführungskontext für ein Skript führt, das gut funktionieren würde, wenn es von dem Benutzer ausgeführt wird, für den das Zielschema festgelegt ist Standardschema. Am besten fügen Sie den Schemanamen in die Einfügeanweisungen ein:

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

update: Versuchen Sie, den Tabellennamen als gebundenen Wert in Ihrer vorbereiteten Anweisung zu binden? Das geht nicht.

1
rsp

Für mich geht das:

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"));
}
0
user2607028