有一个 存储过程如果往该表插入数据,当插入失败是就更新该表数据,我是这么写的BEGIN
INSERT INTO ........
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
UPDATE .....
END;不过UPDATE不成功!大家帮忙看看要怎么修改!网上听说不能这么写!

解决方案 »

  1.   

    在WHEN DUP_VAL_ON_INDEX THEN 里面写FLAG := 1;就是如果发生该情况的时候.把FLAG值设为1.然后在INSERT处理后面(注意,不是下一层,他们的关系应该是并列的),加个判断 IF FLAG = 1 THEN UPDATE.....需要注意的是,在INSERT之前一定要把自己定义的那个中间变量(也就是我用的FLAG)初始化一下.否则就会发生如下的情况.先是发生KEY值重复的情况.然后FLAG = 1,然后下一条数据进行处理,这个时候如果KEY值不重复,正常情况应该是做INSERT处理而不做UPDATE处理,我们来分析一下.如果没有之前的初始话,这个时候FLAG的值,仍然是1.进行了INSERT处理后,下面的IF FLAG = 1 THEN 的值是TRUE.所以他会继续进行后面的UPDATE处理.这个显然不是我们想要的.
      

  2.   

      MERGE INTO COPY_EMP C
      USING EMPLOYEES E
      ON (C.EMPLOYEE_ID = E.EMPLOYEE_ID)
      WHEN MATCHED THEN
        UPDATE
           SET C.FIRST_NAME    = E.FIRST_NAME,
               C.LAST_NAME     = E.LAST_NAME,
               C.DEPARTMENT_ID = E.DEPARTMENT_ID
      WHEN NOT MATCHED THEN
        INSERT
        VALUES
          (E.EMPLOYEE_ID,
           E.FIRST_NAME,
           E.LAST_NAME,
           E.EMAIL,
           E.PHONE_NUMBER,
           E.HIRE_DATE,
           E.JOB_ID,
           E.SALARY,
           E.COMMISSION_PCT,
           E.MANAGER_ID,
           E.DEPARTMETN_ID);去网上查查merge用法,很多哦.
      

  3.   

    同意二楼。
    加一个变量p_message := 'TRUE';在exception里面将这个变量赋值
    p_message := 'FALSE'
    end exception后
    if(p_message == 'FALSE') then
    begin
    update ....
    end;
    end if
      

  4.   

    MERGE是oracle9i的啊,LZ有没有还是更问好
    个人赞同2楼的,设置判断值
      

  5.   

    插入失败则更新  与 用merge 有关系吗?