【问题标题】:ORA-00928 missing SELECT keyword in OracleORA-00928 在 Oracle 中缺少 SELECT 关键字
【发布时间】:2013-01-21 06:17:51
【问题描述】:

我正在使用以下代码插入数据。但是我收到了一个错误"ORA-00928: missing SELECT keyword"

try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
java.sql.Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xxx.xxx.x.xxx:xxxx:xxxx", "xxxx", "xxxx");
String query="insert into offer1('RCODE','OFFERNO','DAT') values(?,?,?)"; 
    PreparedStatement ps=conn.prepareStatement(query);
    ps.setString(1,r_code);
    ps.setString(2,offerno);
    ps.setDate(3,sqlDate);
    ResultSet rs=ps.executeQuery();
    out.println("data inserted");
}catch(Exception e)
 {
     out.println(e);
 }

我在这段代码中看不到任何错误。如果有人发现,请告诉我错误是什么以及如何解决?

【问题讨论】:

  • 总共有 2 个问题,一个是删除列名的单引号,而不是使用 executeQuery() 使用 executeUpdate() 和更多的插入语句,您期望什么结果集。

标签: java sql oracle jdbc prepared-statement


【解决方案1】:

单引号用于字符串文字而不是标识符,因此您应该在 columnNames 周围删除它。

INSERT INTO offer1 (RCODE,OFFERNO,DAT) VALUES (?,?,?)

并使用executeUpdate,因为您没有检索导致结果集的记录。

来自文档

布尔执行()

  • 执行此 PreparedStatement 对象中的 SQL 语句,该对象可以是任何类型的 SQL 语句。

结果集 executeQuery()

  • 在此 PreparedStatement 对象中执行 SQL 查询,并返回查询生成的 ResultSet 对象。

int 执行更新()

  • 执行此 PreparedStatement 对象中的 SQL 语句,该语句必须是 SQL INSERT、UPDATE 或 DELETE 语句;或不返回任何内容的 SQL 语句,例如 DDL 语句。

【讨论】:

    【解决方案2】:

    不用单引号,试试

    String query="insert into offer1(RCODE,OFFERNO,DAT) values(?,?,?)"; 
    

    【讨论】:

    • 真正的解决方案当然是让数据库给出正确的错误信息,这只是一种解决方法。
    【解决方案3】:

    请试试这个

    String query="insert into offer1(RCODE,OFFERNO,DAT) values(?,?,?)"; 
    

    【讨论】:

    • 请详细解释一下!
    【解决方案4】:

    我遇到了同样的问题,就我而言,查询是这样的:

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

    问题是由number 列名引起的,因为number 是Oracle 中的保留关键字,异常是“ORA-00928:缺少SELECT 关键字”。

    所以,number 列名必须转义,如下所示:

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

    现在一切正常。

    【讨论】:

      【解决方案5】:

      尝试Statement.executeUpdate 而不是executeQuery

      【讨论】:

        【解决方案6】:
        ResultSet executeQuery()
        

        在此 PreparedStatement 对象中执行 SQL 查询,并返回查询生成的 ResultSet 对象。

        int executeUpdate()
        

        执行此 PreparedStatement 对象中的 SQL 语句,该语句必须是 SQL INSERT、UPDATE 或 DELETE 语句;或不返回任何内容的 SQL 语句,例如 DDL 语句。

        所以不要使用ResultSet rs = ps.executeQuery();,而是使用 int result = ps.executeUpdate();

        它为 INSERT、UPDATE 或 DELETE 语句返回行数,或者为不返回任何内容的 SQL 语句返回 0

        【讨论】:

          猜你喜欢
          • 2018-07-23
          • 2018-09-17
          • 2018-05-13
          • 1970-01-01
          • 1970-01-01
          • 2018-01-20
          • 2019-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多