java.sql.SQLSyntaxErrorException : ORA-00933: SQL command not properly ended for INSERT INTO SELECT

标签 java oracle jdbc

我有一个下面的查询,它需要使用列作为键来选择行并返回生成的键。

INSERT INTO t_tpms_cc_request
            (process_identifier,
             request_source_id,
             amount,
             etc_account_id,
             retry_count,
             status,
             store_identifier,
             version_no,
             next_process_time,
             composite_transaction_id,
             payment_id,
             processed_time,
             replenishment_id,
             pay_type,
             agency_id,
             response_code,
             file_id,
             request_date,
             auth_file_id,
             auth_date_time,
             merc_file_id,
             merc_date_time,
             cc_num,
             cc_expiration_date,
             merchant_id,
             ext_sys_ref,
             encrypt_cc_number,
             cc_month_cd,
             cc_year_cd,
             orig_txn_ref,
             auth_code,
             avs_code,
             cvv_code)
SELECT CC.process_identifier,
       CC.request_source_id,
       CC.amount,
       CC.etc_account_id,
       CC.retry_count,
       CC.status,
       CC.store_identifier,
       CC.version_no,
       CC.next_process_time,
       CC.composite_transaction_id,
       CC.payment_id,
       CC.processed_time,
       CC.replenishment_id,
       CC.pay_type,
       CC.agency_id,
       CC.response_code,
       CC.file_id,
       CC.request_date,
       CC.auth_file_id,
       CC.auth_date_time,
       CC.merc_file_id,
       CC.merc_date_time,
       CC.cc_num,
       CC.cc_expiration_date,
       CC.merchant_id,
       CC.ext_sys_ref,
       CC.encrypt_cc_number,
       CC.cc_month_cd,
       CC.cc_year_cd,
       CC.orig_txn_ref,
       CC.auth_code,
       CC.avs_code,
       CC.cvv_code
FROM   t_tpms_cc_request CC
WHERE  CC.order_id = ?

并且,我编写了下面的 java 代码来执行此操作:

String key[] = {"order_id"}; 

DataSource ds = null;  
Connection con = null;
ResultSet rs = null;
try {
      ds = jdbcTemplate.getDataSource();
      con = ds.getConnection();
      PreparedStatement ps = 
          con.prepareStatement(insertCCRequest.trim(), key);
    ps.setString(1, OrderId);
      int i= ps.executeUpdate();
      rs = ps.getGeneratedKeys();
      if (rs.next()) {
         return rs.getString(1);
      }
} catch (SQLException e) {
    logger.debug("SQL exception in RebillDao.insertCCrequest() 
                                       method..!! ");
    logger.debug("Exception cause: "+e.getMessage());
    e.printStackTrace();
    throw e;
}
finally {
      if(con!=null){
            con.close();
      }          
}
return "";

当我运行这个时,我得到以下异常:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

请告诉我解决此问题的方法。

此外,使用JDK 1.6ojdbc6-11.2.0.4.jar

最佳答案

我怀疑当您将生成的键与准备好的语句一起使用时,Oracle JDBC 驱动程序会添加 RETURNING INTO INSERT 的条款声明,并且 JDBC 驱动程序太模糊,无法意识到 RETURNING INTO子句不能与 INSERT INTO ... SELECT ... 一起使用声明。如果我尝试运行 INSERT INTO ... SELECT ... RETURNING ...,我会得到相同的 ORA-00933 错误。声明。

您可以尝试使用 PL/SQL block ,我们将“旧”行提取到记录中,然后使用 INSERT ... VALUES带有 RETURNING_INTO 的声明将值插入"new"行的子句:

DECLARE
  l_row     t_tpms_cc_request%ROWTYPE;
BEGIN
  SELECT * INTO l_row FROM t_tpms_cc_request WHERE order_id = ?;
  INSERT INTO t_tpms_cc_request (some_column, some_other_column, ...)
    VALUES (l_row.some_column, l_row.some_other_column, ...)
  RETURNING order_id INTO ?;
END;

当我们从中返回值时,我们需要将其准备为CallableStatement而不是PreparedStatement,并且我们需要将参数2注册为输出参数。然后我们可以使用这个 out 参数,而不是 getGeneratedKeys()您目前正在使用的方法,用于返回生成的键值。

显然,这种方法是 Oracle 特有的,不适用于其他数据库。我不知道数据库可移植性对您来说有多大问题,也不知道您是否可以从INSERT INTO ... SELECT ...返回生成的 key 。其他数据库中的语句。

关于java.sql.SQLSyntaxErrorException : ORA-00933: SQL command not properly ended for INSERT INTO SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767330/

相关文章:

java - mysql数据库中特殊字符的JDBC设置

java - Hibernate 查询实体名称

java - 在虚拟机(即 Dalvik)中运行的垃圾收集语言的内存泄漏类型

sql - CASE WHEN after THEN 或 Select value from another table

sql - 我需要在每年的 Oracle SQL 查询中找到最高投票者

java - 将Java连接到MySQL数据库

java - 从正确的对象引用中使用 volatile 变量

java - 当incrementalCompileWarnings标志设置为true时GWT "No source code is available for type"

java - 当我尝试在编辑器中键入时 Oracle SQL Developer 崩溃

java - Eclipselink - @CascadeOnDelete 不适用于 @OneToOne 关系