15

行のバッチを既存のテーブルに挿入しようとすると、例外が発生します

ORA-00942:表またはビューが存在しません

テーブルがdbに存在することを確認でき、oraclesqldeveloperを使用してそのテーブルにデータを挿入できます。しかし、Javaでpreparedstatementを使用して行を挿入しようとすると、そのスローテーブルは存在しませんというエラーが発生します。

以下のエラーのスタックトレースを見つけてください

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) 

誰かがこのエラーの理由を提案できますか?

更新:問題は解決しました

データベース接続のプロパティ、またはテーブル名やビュー名に問題はありませんでした。問題の解決策は非常に奇妙でした。挿入しようとした列の1つは、Clobタイプでした。以前にOracleデータベースでclobデータを処理するのに多くの問題があったので、clobセッターを一時的な文字列セッターに置き換えて同じコードを問題なく実行し、すべての行が正しく挿入されたことを試してみました!!!。

すなわち。peparedstatement.setClob(columnIndex、clob)

に置き換えられました

peparedstatement.setString(columnIndex、 "String")

エラーテーブルまたはビューが存在する理由エラーは、clobデータの挿入中にエラーが発生したためにスローされました。誰か説明してもらえますか?

あなたの答えとコメントをどうもありがとう。

4

10 に答える 10

14

テーブルが存在する場合、Oracleはこのエラーも報告しますが、そのテーブルに対する権限はありません。したがって、テーブルがそこにあることが確実な場合は、助成金を確認してください。

于 2011-07-03T08:35:41.323 に答える
10

setCLOB()に問題があり、ターゲットテーブルが存在し、正しく特権が設定されている場合に、特定の状況でORA-00942が発生するようです。現在、この正確な問題が発生しています。CLOBを同じテーブルにバインドしないだけで、ORA-00942をなくすことができます。

java.sql.Clobを使用してsetClob()を試し、oracle.jdbc.CLOBを使用してsetCLOB()を試しましたが、同じ結果になりました。

あなたが言うように、文字列としてバインドすると問題は解決しますが、これによりデータサイズが4kに制限されます。

テストから、CLOBをバインドする前に、セッションでトランザクションが開いているときにトリガーされるようです。これを解決したらフィードバックします...Oracleサポートを確認します。

于 2011-07-12T13:51:52.063 に答える
7

データベース接続のプロパティ、またはテーブル名やビュー名に問題はありませんでした。問題の解決策は非常に奇妙でした。挿入しようとした列の1つは、Clobタイプでした。以前にOracleデータベースでclobデータを処理するのに多くの問題があったので、clobセッターを一時的な文字列セッターに置き換えて同じコードを問題なく実行し、すべての行が正しく挿入されたことを試してみました!!!。

すなわち。peparedstatement.setClob(columnIndex、clob)

に置き換えられました

peparedstatement.setString(columnIndex、 "String")

于 2011-07-19T08:40:27.243 に答える
4

@unbeliは正しいです。テーブルに適切な許可がない場合、このエラーが発生します。その価値について、私は最近これを経験しました。あなたが説明した正確な問題が発生していました。SQLDeveloperを介して挿入ステートメントを実行できましたが、Hibernateを使用すると失敗しました。私はついに、自分のコードが明白な挿入以上のことをしていることに気づきました。適切な許可がなかった他のテーブルへの挿入。付与特権を調整することで、これは解決しました。

注:コメントする評判はありません。そうでない場合、これはコメントである可能性があります。

于 2011-07-18T12:45:17.553 に答える
3

この問題はBLOB列で発生しました。このエラーが発生したときに他の誰かがこの質問に遭遇した場合に備えて、問題を解決した方法は次のとおりです。

私たちはこれから始めました:

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

その行を次のように変更することで、問題を解決しました。

        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);
        }
于 2014-07-14T17:47:14.920 に答える
2

データを4Kに制限するJDBCのsetString()メソッドを使用せずに、この問題を解決する方法を見つけました。

あなたがする必要があるのはpreparedStatement.setClob(int parameterIndex、Readerreader)を使うことです。少なくともこれは私のために働いたものです。Oracleドライバはデータを文字ストリームに変換して挿入すると思いましたが、そうではないようです。または、エラーの原因となる特定の何か。

characterStreamの使用は私にとってはうまくいくようです。あるデータベースからテーブルを読み取り、jdbcを使用して別のデータベースに書き込みます。そして、私はそれが上で述べられているように、テーブルが見つからないというエラーを取得していました。だからこれは私が問題を解決した方法です:

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;

今はすべて良いです。

于 2012-03-15T15:56:26.133 に答える
1

スクリプトはスキーマ名を提供していますか、それともデータベースにログインしているユーザーに依存してデフォルトのスキーマを選択していますか?

スキーマに名前を付けず、スキーマユーザーではなくシステムユーザーでバッチを実行すると、スクリプトの実行コンテキストが正しくなくなり、ターゲットスキーマが次のように設定されているユーザーによって実行された場合に正常に機能する可能性があります。デフォルトのスキーマ。最善のアクションは、挿入ステートメントにスキーマ名を含めることです。

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

更新:プリペアドステートメントでテーブル名をバインドされた値としてバインドしようとしていますか?それはうまくいきません。

于 2011-07-03T08:00:48.303 に答える
0

わたしにはできる:

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"));
}
于 2015-06-12T16:04:27.000 に答える
0

あなたがのためにやっているが、それからのためにやっている可能性INSERTVARCHARありINSERTますUPDATECLOB

その場合は、UPDATEに加えてテーブルに権限を付与する必要がありますINSERT

https://stackoverflow.com/a/64352414/1089967を参照してください

于 2020-10-20T08:59:59.110 に答える
-1

ここで私は質問の解決策を得ました。あなたがそれを使用している場合、問題はガラスの魚にあります。JNDI名を作成するときは、プール名が正しく、プール名が作成した接続プール名の名前であることを確認してください。

ここに画像の説明を入力してください

于 2017-11-16T11:37:16.417 に答える