在删除时找不到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中到底有什么。我的意思是绑定变量及其类型,只是为了确认没有隐式数据类型转换或类似的操作