drddx3115 2015-03-26 07:35
浏览 235
已采纳

在ORACLE DB中执行upsert并且不起作用

I am doing an insert condition in oracle that when the record based on job and subjob doesnt exists, it shall insert otherwise, if it exists then it should update the rest of the value.

this is my procedure,

CREATE OR REPLACE PROCEDURE WELTESADMIN.SP_JOB_INS
(
    JOB_V VARCHAR2,
    SUBJOB_V VARCHAR2,
    STARTDATE_V DATE,
    ENDDATE_V DATE,
    JOBWEIGHT_V NUMBER
)
AS BEGIN INSERT INTO PROJECT_SPAN (JOB, SUBJOB, STARTDATE, ENDDATE, WEIGHT) VALUES (JOB_V, SUBJOB_V, STARTDATE_V, ENDDATE_V, JOBWEIGHT_V);
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
UPDATE PROJECT_SPAN SET STARTDATE = STARTDATE_V, ENDDATE = ENDDATE_V, WEIGHT = JOBWEIGHT_V WHERE JOB = JOB_V AND SUBJOB = SUBJOB_V;
END;
/

and this is from PHP Call,

$insertJobSpanSql = "BEGIN SP_JOB_INS(:JOB, :SUBJOB, :SDATE, :EDATE, :WT); END;";
            $insertJobSpanParse = oci_parse($conn, $insertJobSpanSql);
            oci_bind_by_name($insertJobSpanParse, ":JOB", $jobValue);
            oci_bind_by_name($insertJobSpanParse, ":SUBJOB", $subJobValue);
            oci_bind_by_name($insertJobSpanParse, ":SDATE", $startDateValue);
            oci_bind_by_name($insertJobSpanParse, ":EDATE", $endDateValue);
            oci_bind_by_name($insertJobSpanParse, ":WT", $jobWeightValue);
            $insertJobSpanRes = oci_execute($insertJobSpanParse);

            if ($insertJobSpanRes){
                oci_commit($conn);
            } else {
                oci_rollback($conn);
            }

problem is it keeps inserting new row with the same job and subjob value. it should be an update to the new value.

  • 写回答

2条回答 默认 最新

  • duankui1532 2015-03-26 08:16
    关注

    First of all, I recommend to use MERGE in such cases:

    CREATE OR REPLACE PROCEDURE WELTESADMIN.SP_JOB_INS
    (
        JOB_V VARCHAR2,
        SUBJOB_V VARCHAR2,
        STARTDATE_V DATE,
        ENDDATE_V DATE,
        JOBWEIGHT_V NUMBER
    ) AS 
    BEGIN 
      merge into PROJECT_SPAN ps
      using (select JOB_V, SUBJOB_V, STARTDATE_V, ENDDATE_V, JOBWEIGHT_V 
               from dual) new_val
         on (ps.SUBJOB = new_val.SUBJOB_V and ps.JOB = new_val.JOB_V)
       when matched then update
        set STARTDATE = new_val.STARTDATE_V, 
            ENDDATE = new_val.ENDDATE_V, 
            WEIGHT = new_val.JOBWEIGHT_V
       when not matched then insert (JOB, SUBJOB, STARTDATE, ENDDATE, WEIGHT)
     values (new_val.JOB_V, new_val.SUBJOB_V, new_val.STARTDATE_V, 
             new_val.ENDDATE_V, new_val.JOBWEIGHT_V );
    END;
    /
    

    If it still not updating values, use package DBMS_OUTPUT or logging into a table to make sure, that new and old JOB and SUBJOB really the same.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误