J'obtiens en-dessous de l'exception lorsque j'essaie d'insérer un lot de lignes dans une table existante
ORA-00942: la table ou la vue n'existe pas
Je peux confirmer que la table existe dans la base de données et je peux insérer des données dans cette table en utilisant Oracle Sql developer. Mais lorsque j'essaie d'insérer des lignes à l'aide de l'état préparé en Java, sa table de projection n'existe pas d'erreur.
Veuillez trouver la trace d'erreur de pile ci-dessous
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)
Quelqu'un peut-il suggérer les raisons de cette erreur?
Mise à jour: Problème résolu
Il n'y avait aucun problème avec les propriétés de ma connexion à la base de données ou avec mon nom de table ou de vue. La solution au problème était très étrange. L'une des colonnes que j'essayais d'insérer était de type Clob. Comme j'avais beaucoup de mal à gérer les données de cluster dans Oracle db auparavant, j'ai essayé de remplacer le configurateur de clob par un sélecteur de chaîne temporaire et le même code exécuté sans aucun problème et toutes les lignes étaient correctement insérées !!!.
c'est à dire. peparedstatement.setClob (columnIndex, clob)
a été remplacé par
peparedstatement.setString (columnIndex, "String")
Pourquoi une table ou une vue d'erreur existe-t-il une erreur a été générée lors de l'insertion de données clob. Quelqu'un d'entre vous pourrait-il expliquer s'il vous plaît?
Merci beaucoup pour vos réponses et vos commentaires.
Il n'y avait aucun problème avec les propriétés de ma connexion à la base de données ou avec mon nom de table ou de vue. La solution au problème était très étrange. L'une des colonnes que j'essayais d'insérer était de type Clob. Comme j'avais beaucoup de mal à gérer les données de cluster dans Oracle db auparavant, j'ai essayé de remplacer le configurateur de clob par un sélecteur de chaîne temporaire et le même code exécuté sans aucun problème et toutes les lignes ont été correctement insérées !!!.
c'est à dire. peparedstatement.setClob (columnIndex, clob)
a été remplacé par
peparedstatement.setString (columnIndex, "String")
Oracle signalera également cette erreur si la table existe, mais vous ne disposez d'aucun privilège dessus. Donc, si vous êtes sûr que la table est là, vérifiez les subventions.
SetCLOB () semble poser un problème qui provoque un ORA-00942 dans certaines circonstances lorsque la table cible existe et est correctement privilégiée. J'ai ce problème précis maintenant, je peux faire disparaître le ORA-00942 en ne liant tout simplement pas le CLOB dans la même table.
J'ai essayé setClob () avec un Java.sql.Clob et setCLOB () avec un Oracle.jdbc.CLOB mais avec le même résultat.
Comme vous le dites, si vous vous associez à une chaîne, le problème disparaît - mais cela limite alors la taille de vos données à 4 ko.
D'après les tests, il semble être déclenché lorsqu'une transaction est ouverte sur la session avant de lier le CLOB. Je vous répondrai quand j'aurai résolu ceci ... en vérifiant le support Oracle.
@unbeli a raison. Ne pas avoir les autorisations appropriées sur une table entraînera cette erreur. Pour ce que ça vaut, j'ai récemment fait l'expérience de ça. Je rencontrais le problème exact que vous avez décrit, je pouvais exécuter des instructions insert par le biais du développeur SQL mais échouerais si vous utilisiez le mode veille prolongée. J'ai finalement réalisé que mon code faisait plus que l'insertion évidente. Insertion dans d'autres tables pour lesquelles les subventions n'étaient pas appropriées. L'ajustement des privilèges de subvention a résolu ce problème pour moi.
Remarque: Vous n'avez pas de réputation à commenter, sinon cela aurait pu être un commentaire.
J'ai trouvé comment résoudre ce problème sans utiliser la méthode setString () de JDBC, qui limite les données à 4K.
Ce que vous devez faire, c'est utiliser prepareStatement.setClob (int parametersIndex, Reader Reader). Au moins c'est ce qui a fonctionné pour moi. Je pensais que les pilotes Oracle convertissaient les données en flux de caractères pour les insérer. Ou quelque chose de spécifique causant une erreur.
Utiliser un characterStream semble fonctionner pour moi. Je lis des tables d’une base de données et j’écris sur une autre en utilisant jdbc. Et je devenais erreur de table non trouvée juste comme il est mentionné ci-dessus. Voici comment j'ai résolu le problème:
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;
Tout va bien maintenant.
Nous avons rencontré ce problème sur une colonne BLOB. Juste au cas où quelqu'un d'autre tomberait sur cette question en rencontrant cette erreur, voici comment nous avons résolu le problème:
Nous avons commencé avec ceci:
preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break;
Nous avons résolu le problème en remplaçant cette ligne par ceci:
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);
}
Votre script fournit-il le nom du schéma , ou comptez-vous sur l’utilisateur connecté à la base de données pour sélectionner le schéma par défaut ?
Il se peut que vous ne nommiez pas le schéma et que vous effectuiez votre lot avec un utilisateur système à la place de l'utilisateur du schéma, ce qui donnerait un contexte d'exécution incorrect pour un script qui fonctionnerait correctement s'il était exécuté par l'utilisateur dont le schéma cible est défini comme suit: schéma par défaut. Votre meilleure action serait d’inclure le nom du schéma dans les instructions d’insertion:
INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue')
update: Essayez-vous de lier le nom de la table en tant que valeur liée dans votre instruction préparée? Ça ne marchera pas.
Ça marche pour moi:
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"));
}