微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在删除时找不到GTT行,但在插入时找到了GTT行

如何解决在删除时找不到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 举报,一经查实,本站将立刻删除。