gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:59:56 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com