如何解决在删除时找不到GTT行,但在插入时找到了GTT行
我从未在Oracle和Java下使用过GTT。
我想用它来管理一些数据,我想添加一些产品预测,并希望在插入按ID查找之前删除所有现有行
这是我的GTT
CREATE GLOBAL TEMPORARY TABLE "M_PRODUCT_FORECAST"
(
"M_PRODUCT_FORECAST_ID" NUMBER(10,0) NOT NULL ENABLE,"FORECAST_MODE" CHAR(1 BYTE) DEFAULT 'D' NOT NULL ENABLE,"FORECAST_QTY" NUMBER DEFAULT 1 NOT NULL ENABLE,CHECK (forecast_mode IN ('D','P')) ENABLE,CONSTRAINT "M_PRODUCT_FORECAST_KEY" PRIMARY KEY ("M_PRODUCT_FORECAST_ID","FORECAST_MODE") ENABLE
) ON COMMIT PRESERVE ROWS ;
然后这是我的Java代码
private void addProductToForecast() {
Integer productId = (Integer) productSearchEditor.getValue();
BigDecimal qty = qtyNumberBox.getValue();
String mode = developementCheckBox.isSelected()?"D":"P";
PreparedStatement ps = null;
try {
String deletePrevIoUsForcastIfExists = " DELETE FROM "+M_PRODUCT_FORECAST
+ " WHERE "+M_PRODUCT_FORECAST_ID+" = ? "
+ " AND "+FORECAST_MODE+" = ?";
ps = DB.prepareStatement(deletePrevIoUsForcastIfExists,null);
ps.setInt(1,productId);
ps.setString(2,mode);
int update = ps.executeUpdate();
log.info(deletePrevIoUsForcastIfExists + "return update value :: "+update);
} catch (sqlException e) {
e.printstacktrace();
}finally {
Util.closeCursor(ps,null);
ps = null;
}
try {
String insertIntoForcast = " INSERT INTO " +M_PRODUCT_FORECAST
+" VALUES(?,?,?)";
ps = DB.prepareStatement(insertIntoForcast,mode);
ps.setBigDecimal(3,qty);
int update = ps.executeUpdate();
log.info(insertIntoForcast + "return update value :: "+update);
} catch (sqlException e) {
e.printstacktrace();
} finally {
Util.closeCursor(ps,null);
ps = null;
}
}
NB
在调试第一个删除更新值时返回0,我想这意味着它找不到要删除的任何行,但是,插入操作正在违反唯一键异常,这意味着存在数据。
java.sql.sqlIntegrityConstraintViolationException:ORA-00001:违反唯一性(M_PRODUCT_FORECAST_KEY)
解决方法
首先,我建议使用merge
而不是delete
+ insert
:
merge into M_PRODUCT_FORECAST m
using (
select :id as id,:mode as mode,:qty as qty
from dual) n
on (m.M_PRODUCT_FORECAST_ID = n.id and m.FORECAST_MODE = n.mode)
when matched then update
set m.M_PRODUCT_FORECAST_ID = n.mode
when not matched then
insert
values (n.id,n.mode,n.qty)
此外,我将检查db中到底有什么。我的意思是绑定变量及其类型,只是为了确认没有隐式数据类型转换或类似的操作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。