after delete  没有 :new 
after update 也没有 :new 

解决方案 »

  1.   

    建议换成 before 试试。
      

  2.   

    我现在给改成这个逻辑了  不用new也不可以啊 还有哪里要用before呢
    create or replace trigger tri_User
        after insert or update or delete
        on USER_MAPPING
        referencing old as old_value
                    new as new_value
        for each row
          declare UNIQUEID varchar(32);
                  IDCARD  varchar(18);
                  PHONENUM varchar(11);
                  c_num integer;     
    begin
     SELECT COUNT(*) INTO c_num FROM USERS  WHERE UNIQUEID = :new_value.UNIQUEID;
        IF c_num = 1  THEN     /* 1 存在 更新 删除 */
        -- update UNIQUEID 
        --dbms_output.put_line(1);
        if updating then
          update USERS set IDCARD = :new_value.IDCARD,PHONENUM=:new_value.PHONENUM
          where UNIQUEID = :new_value.UNIQUEID;
          end if;
         -- delete  
        if deleting then
          delete from USERS where UNIQUEID = :old_value.UNIQUEID;
          end if;
        ELSIF  c_num  < 1 THEN      -- 0 不存在 就插入    1 不执行
      --insert  唯一ID (UNIQUEID ) 身份证号(IDCARD)手机号(PHONENUM) *\
        -- insert UFNIQUEID 
         -- dbms_output.put_line(2);
        if  :new_value.IDCARD is null  THEN
            IDCARD := '';
        end if;
        if  :new_value.PHONENUM is null  THEN
            PHONENUM :='';
        end if;
        if inserting then
                   insert into USERS(UNIQUEID,IDCARD,PHONENUM)
                   values(:new_value.UNIQUEID, :new_value.IDCARD, :new_value.PHONENUM);
        end if;
     END IF;
    end;
      

  3.   

    insert 没有  :old.  
    delete  没有 :new.
      

  4.   

    不行啊,版主都出来啦,谢谢,还是不能更新,只能insert
      

  5.   

    这个是users(唯一用户)表create table "dbo".USERS 
    (
       UNIQUEID             VARCHAR(32)          not null,
       STATE                NUMBER(2),
       VERSION_TIME         DATE,
       IS_STOP              NUMBER(2),
       PHONENUM             VARCHAR(11),
       IDCARD               VARCHAR(18),
       BARCODE              NVARCHAR2(50),
       USER_LEVEL           NVARCHAR2(10),
       constraint PK_USERS primary key (UNIQUEID)
    );
    这个是用户mapping 表create table "dbo".USER_MAPPING 
    (
       MAPPID               NVARCHAR(32)         not null,
       UNIQUEID             NVARCHAR2(32),
       CARDID               nchar(32),
       ACCOUNTTYPE          NUMBER(2),
       CARD                 NVARCHAR2(20),
       NAME                 NVARCHAR2(10),
       GENDER               NUMBER(2),
       IDCARD               NVARCHAR2(18),
       PHONENUM             nvarchar2(30),
       NICKNAME             VARCHAR2(64),
       HEAD_IMG_URL         nvarchar2(256),
       EMAIL                NVARCHAR2(128),
       IS_APPLY_MEMBER      NVARCHAR2(10),
       UNIONID              NVARCHAR2(100),
       REMARK               NVARCHAR2(500),
       CREATETIME           DATE,
       SUBSCRIBE            NUMBER(2),
       "VipName"            VARCHAR(30),
       "Viprank"            VARCHAR2(30),
       PRANK                VARCHAR2(30),
       STATE                VARCHAR2(30),
       IDPRANK              NUMBER(2),
       BIRTHTIME            DATE,
       AGE                  CHAR(5),
       ADDRESS              VARCHAR2(50),
       AREA                 VARCHAR2(50),
       ZIPCODE              NUMBER(8,0),
       VOCATION             VARCHAR2(30),
       TELPHONE             VARCHAR2(30),
       STATUS               CHAR(10),
       INCOME               NUMBER(18,2),
       "Vehicle"            VARCHAR2(30),
       CARNUM               NUMBER(8),
       VALIDITY             VARCHAR2(30),
       LOVE                 VARCHAR2(30),
       IS_INFORMATION       CHAR(2),
       PASSWORD             VARCHAR2(256),
       constraint PK_USER_MAPPING primary key (MAPPID),
       constraint AK_KEY_2_USER_MAP unique ()
    );
    可以没有主外键关系的
      

  6.   

    看了你的第二个 trigger  有点点晕啊  , 测试了一下, insert  和update还是有效的,只是delete 无效。 
    delete无效是因为 你delete 的时候 没有 :new.uniqueid 所以 查不到记录。 
    建议你两个分开,  在第一个 把delete 给拿掉,第二个的话 create or replace trigger tri_User_del
        after  delete
        on USER_MAPPING
        referencing old as old_value
                    new as new_value
        for each row
          
    declare UNIQUEID varchar(32);
                  IDCARD  varchar(18);
                  PHONENUM varchar(11);
                  c_num integer;
    begin
     SELECT COUNT(*) INTO c_num FROM USERS  WHERE UNIQUEID = :old_value.UNIQUEID;
     dbms_output.put_line(c_num);
        IF c_num = 1  THEN     /* 1 存在 更新 删除 */
        -- update UNIQUEID
        --dbms_output.put_line(1);
        if updating then
          update USERS set IDCARD = :new_value.IDCARD,PHONENUM=:new_value.PHONENUM
          where UNIQUEID = :new_value.UNIQUEID;
          end if;
         -- delete
        if deleting then
          delete from USERS where UNIQUEID = :old_value.UNIQUEID;
          end if;
        ELSIF  c_num  < 1 THEN      -- 0 不存在 就插入    1 不执行
      --insert  唯一ID (UNIQUEID ) 身份证号(IDCARD)手机号(PHONENUM) *\
        -- insert UFNIQUEID
         -- dbms_output.put_line(2);
        if  :new_value.IDCARD is null  THEN
            IDCARD := '';
        end if;
        if  :new_value.PHONENUM is null  THEN
            PHONENUM :='';
        end if;
        if inserting then
                   insert into USERS(UNIQUEID,IDCARD,PHONENUM)
                   values(:new_value.UNIQUEID, :new_value.IDCARD, :new_value.PHONENUM);
        end if;
     END IF;
    end;自己修改一下。 
      

  7.   

    还是不行啊版主,我第一次插入时候可以 第二次插入时候就报错了,我的需求是像user_mapping表里插入mappid,uniqueid,mappid每次不是重复的,但是uniqueid每次都是一样的。比如
    第一次插入
    insert into user_mapping(mappid,uniqueid,phonenum) values
    ('B530594F8A714D227E3244482A846109','123','6666')
    第二次插入
    insert into user_mapping(mappid,uniqueid,phonenum) values
    ('f530594F8A714D227E3224482A846109','123','7777')
      

  8.   

    但是 你的两次insert  的话, 第二次  insert  查询出来的c_num=1 ,但是 你的流程中, 当c_num=1的时候,只有 delete 和update 有做出处理。 
    建议你  还是 把你的流程用 流程图或者什么的画出来,
    或者做个大概的提纲,
    1.在insert 时候  如果uniqueid =1  做什么操作
     如果=0 的时候 做什么操作
    2. 在delete 时候如果uniqueid =1  做什么操作
     如果=0 的时候 做什么操作
    3 在update 的时候如果uniqueid =1  做什么操作
     如果=0 的时候 做什么操作
    如果容易搞混掉,那就分成三个触发器写,  
      

  9.   

    逻辑很简单的 就是当插入user_mapping 时候如果uniqueid查到了 就不插入数据了,只触发update或者delete
    如果查询不到uniqueid就insert,求代码啊大神。
      

  10.   

    我知道问题出现在哪里了,是不是我第一次insert 时候执行insert 第二次insert时候实际uniqueid值没有变但是其他值变了,但是因为是insert所以没有执行update触发器啊