java.sql.SQLException:ORA-00928:SELECTキーワードがありません。 JDBCを使用してDBにレコードを挿入するとき

私はdbにいくつかの行を挿入しようとするとエラーが発生します。コードはここにあります

try {
    String insertStmt = "INSERT into " +
                        "MY_TABLE('RECORD_TYPE', 'FILE_TYPE', 'DATE', 'BATCH_NO', 'RECORD_COUNT')" +
                        "VALUES(?, ?, ?, ?, ?);";

    PreparedStatement pstmt = super.con.prepareStatement(insertStmt);

    pstmt.setString(1, input[0]);
    pstmt.setString(2, input[1]);
    pstmt.setString(3, input[2]);
    pstmt.setString(4, input[3]);
    pstmt.setString(5, input[4]);

    System.out.println("Insert rows : " + pstmt.executeUpdate());

} catch (SQLException sqle) {
    System.out.println(sqle.getMessage());
    sqle.printStackTrace();
} catch (Exception e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
} finally {
    con.close();
}

dbのすべてがvarchar型で、列をダブルチェックして(すべて同じ名前です)、列名の引用符を取り除き(同じ結果)、成功しません。それを追加するには、エラーメッセージはあまり役に立ちません。

任意の提案をいただければ幸いです。

8
ちょっと人々、あなたのすべての提案をありがとう。 valuesキーワードを含むスペースが問題を引き起こしました。再度、感謝します! :D
追加された 著者 niccolo m.,
引用符を付けずに(二重引用符があれば)、後ろにセミコロンを付けずに、 values の前にスペースを入れて試してください。
追加された 著者 Thilo,
DATEは通常は無効な識別子なので、二重引用符を使用する必要があると思います。 (だから、それを列名として使うべきではありません。プラス、それはなぜ文字列として格納されますか?)
追加された 著者 Jon Heller,
実際には values の前にスペースは必要ありませんが、通常はそれがより良く見えます。
追加された 著者 Jon Heller,
RECORD_COUNTとVALUES(...の間にスペースはありません)あなたの挿入コマンドは 'INSERT into MY_TABLE(......)VALUES(????) `のようになります
追加された 著者 Kal,
クエリの最後の二重引用符の前にセミコロンを削除します。
追加された 著者 One-One,

6 答え

SQL 文を変更する必要があります。 (予約語を識別子として使用しないでください)

String insertStmt = "INSERT into \"MY_TABLE\" (RECORD_TYPE,FILE_TYPE, 
              \"DATE\",BATCH_NO,RECORD_COUNT) VALUES (?, ?, ?, ?, ?)";

予約語/エスケープをエスケープするには、 "(二重引用符)を使用します。

4
追加された
ねえ、私はここでそれに答えようとしていました。日付の列を二重引用符で囲んでエスケープする必要があります。答えをありがとう:D:D:D
追加された 著者 niccolo m.,

私は2つの問題を見つけることができます:

  1. 列名を一重引用符で囲む必要はありません。しかし、二重引用符で囲むことができます。列名または表名に予約済みのキーワードを使用する場合は必要です。ここに DATE
  2. VALUES の前にスペースが必要です。

したがって、 insertStmt を次のように変更する必要があります。

String insertStmt = "INSERT into " +
    "MY_TABLE(RECORD_TYPE, FILE_TYPE, \"DATE\", BATCH_NO, RECORD_COUNT) " +
    "VALUES(?, ?, ?, ?, ?);";
3
追加された
OPとタイトルを読む - それはすべてオラクルに関するものです。
追加された 著者 adatapost,
@AVD答えを編集し、それを指摘してくれてありがとう
追加された 著者 Jomoos,

insertStatt文字列をコンソールに表示し、直接バックエンドで起動しようとします。それはあなたにバックエンドで正確なエラーを与えます。それはいくつかのスペースや構文エラーを検出します。

2
追加された
うん、私はdb ideからレコードを挿入しようとし、いくつかの構文エラーがあることを知っていた。答えjwalinに感謝します。感謝します
追加された 著者 niccolo m.,
いつでもサイモンを歓迎..
追加された 著者 Jwalin Shah,

ORA-00928を検索しているときにこのページに来ました。私の問題は列リストの最初のカンマでした。

INSERT INTO redacted.redacted
  (
  , redacted_id   -- The comma at the start of this line will trigger ORA-00928.
  , another_redacted_id
  , redacted1
  , redacted2
  , redacted3
  , created_at
  , created_by
  , changed_at
  , changed_by
  )
  VALUES
  (?, ?, ?, ?, ?, ?, ?, ?, ?)
1
追加された

私は同じ問題を実行していた、私のケースでは、クエリはこのようだった:

insert into Address (number, street, id) values (?, ?, ?)

この問題は、 number がOracleの予約済みキーワードであるため、 number の列名によって発生しました。例外は誤解を招くような ORA-00928:/code>

number 列をエスケープした後、その文は正常に実行されました:

insert into Address ("number", street, id) values (?, ?, ?)
0
追加された

他の人が同じエラーを検索する場合:クエリの他の構文上の問題により、同じ例外がスローされることがあります。たとえば、VALUESという単語を省略します。

0
追加された