web-dev-qa-db-ja.com

例外ORA-00942の取得:テーブルまたはビューが存在しません-既存のテーブルに挿入するとき

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

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

テーブルがdbに存在することを確認でき、Oracle SQL開発者を使用してそのテーブルにデータを挿入できます。しかし、Javaでpreparestatementを使用して行を挿入しようとすると、スローテーブルが存在しないというエラーが発生します。

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

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) 

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

pdate:問題が解決しました

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

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

に置き換えられました

peparedstatement.setString(columnIndex、 "String")

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

回答やコメントをありがとうございます。

13
aquero

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

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

に置き換えられました

peparedstatement.setString(columnIndex、 "String")

7
aquero

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

13
unbeli

ターゲットテーブルが存在し、適切な権限が付与されている場合、特定の状況下でORA-00942を引き起こすsetCLOB()の問題があるようです。私は今まさにこの問題を抱えています。CLOBを同じテーブルにバインドしないだけで、ORA-00942を解消できます。

Java.sql.ClobでsetClob()を試し、Oracle.jdbc.CLOBでsetCLOB()を試しましたが、結果は同じでした。

あなたが言うように、あなたが文字列としてバインドすれば問題はなくなります-しかし、これはあなたのデータサイズを4kに制限します。

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

10
Adrian

@unbeliは正しいです。テーブルに適切な権限がないと、このエラーが発生します。それだけの価値があるので、私は最近これを経験しました。私はあなたが説明した正確な問題を経験していました、SQL開発者を通して挿入ステートメントを実行できましたが、休止状態を使用すると失敗しました。私のコードは明らかな挿入以上のことをしていることにようやく気付きました。適切な付与がなかった他のテーブルへの挿入。付与権限を調整することでこれを解決しました。

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

3
Jonathan Dixon

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

あなたがする必要があるのは、preparedStatement.setClob(int parameterIndex、Reader reader)を使用することです。少なくともこれは私にとってうまくいったものです。オラクルのドライバーはデータを文字ストリームに変換して挿入するようですが、そうではないようです。またはエラーを引き起こす特定の何か。

CharacterStreamを使用するとうまくいくようです。私は1つのデータベースからテーブルを読み取り、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;

すべて順調です。

2
Bren

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

スクリプトはスキーマ名を提供していますか、またはデータベースにログインしているユーザーがデフォルトスキーマを選択することを信頼していますか?

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

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

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

1
rsp

わたしにはできる:

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