2011-11-25 28 views
8

Tôi gặp lỗi khi cố gắng chèn một số hàng vào một db. vì vậy đây là mãjava.sql.SQLException: ORA-00928: thiếu từ khóa SELECT. khi chèn bản ghi vào DB bằng cách sử dụng JDBC

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(); 
} 

và tất cả mọi thứ trên db là kiểu varchar, hai lần kiểm tra các cột (tất cả họ đều cùng tên), lấy ra các dấu ngoặc kép tắt tên cột (giống kết quả) không thành công. để thêm nó lên, thông báo lỗi không phải là rất hữu ích.

mọi đề xuất sẽ được đánh giá cao.

+3

Cố gắng mà không có dấu ngoặc kép (nên dấu ngoặc kép nếu có), nếu không có sự chấm phẩy dấu, và với một không gian trước khi 'values'. – Thilo

+4

Không có khoảng cách giữa RECORD_COUNT) và VALUES (.. do đó lệnh chèn của bạn trông giống như 'INSERT thành MY_TABLE (......) VALUES (????) ' – Kal

+3

Tôi nghĩ bạn sẽ luôn cần phải sử dụng (vì lý do tại sao bạn không nên sử dụng nó như một tên cột. Và cộng thêm, tại sao nó được lưu trữ như một chuỗi?) –

Trả lời

3

tôi có thể nhận ra hai vấn đề:

  1. Không cần dấu nháy đơn xung quanh tên cột. Nhưng bạn có thể quấn nó trong dấu ngoặc kép. Nó là cần thiết nếu bạn đang sử dụng từ khóa dành riêng cho tên cột hoặc tên bảng. Đây là DATE.
  2. Bạn cần một khoảng trắng trước VALUES.

Vì vậy, bạn cần phải thay đổi insertStmt để somthing như thế này:

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

Đọc OP và tiêu đề - Đó là tất cả về ** oracle **. – adatapost

+0

@AVD Đã chỉnh sửa câu trả lời và cảm ơn vì đã chỉ ra rằng – Jomoos

2

In insertStmt String trong Bảng điều khiển và cố gắng kích hoạt nó trong phần phụ trợ trực tiếp. Nó cung cấp cho bạn lỗi chính xác trong chương trình phụ trợ. Nó seens một số khoảng cách hoặc lỗi cú pháp.

+1

yep, tôi đã thử chèn một bản ghi từ ide db và biết rằng có một số lỗi cú pháp. cảm ơn câu trả lời jwalin. đánh giá cao nó –

+0

Chào mừng bất cứ lúc nào simon .. –

4

Bạn cần thay đổi câu hỏi SQL. (Không bao giờ sử dụng các từ dành riêng làm số nhận dạng)

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

Sử dụng " (dấu ngoặc kép) để thoát khỏi các từ/từ khóa được dành riêng.

+0

hey người đàn ông, tôi đã về để trả lời rằng ở đây. Đúng, cột ngày cần được bao quanh bởi dấu ngoặc kép và sau đó thoát. cảm ơn cho câu trả lời: D: D: D –

1

Tôi chỉ đến trang này khi tìm kiếm ORA-00.928, và tôi muốn lưu ý rằng vấn đề của tôi là một phụ dấu phẩy ở đầu danh sách cột:

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 
    (?, ?, ?, ?, ?, ?, ?, ?, ?) 
0

Đối với những người khác đang tìm kiếm cùng một lỗi: Các vấn đề cú pháp khác với truy vấn có thể gây ra cùng ngoại lệ. Ví dụ, bỏ qua các giá trị từ.

0

Tôi đã chạy cùng một vấn đề, và trong trường hợp của tôi truy vấn là như thế này:

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

Vấn đề là do tên number cột từ number là một từ khóa dành riêng trong Oracle, và các ngoại lệ là loại gây hiểu nhầm ORA-00928: missing SELECT keyword.

Sau khi thoát khỏi cột number, báo cáo kết quả được thực hiện bình thường:

insert into Address ("number", street, id) values (?, ?, ?) 
Các vấn đề liên quan