oracle数据库,emp_info_table表结构如下:
职工档案编号  配偶档案编号  职工姓名 职工身份证 配偶姓名 配偶身份证号
dangan_number  po_dangan_number  xm  sfzh   po_xm  po_sfzh公司为每个员工建档,有唯一的档案编号,每个人一条记录,配偶为外公司,配偶档案编号为空,如果配偶在本公司,配偶自然也要建档,要求夫妻在同一公司的人配偶档案编号要与自己的爱人对应,用触发器自动在数据库生成,比如职工的记录中姓名和身份证号与某一条记录中配偶姓名与配偶身份证号能对应上,就认作这两人是夫妻,要在他们每个人的配偶档案编号这个字段中加上对方的档案编号,如果2个人离婚,配偶姓名和身份证号有变动,则双方配偶档案编号也随之变化。
我写了一个触发器,不过是错误的,请各位高手告诉我正确的写法,谢谢~
CREATE OR REPLACE TRIGGER tg_dangan_number
AFTER INSERT OR UPDATE OR DELETE
ON EMP_INFO_TABLE
FOR EACH ROW
BEGIN
 CASE
     WHEN UPDATING THEN
UPDATE EMP_INFO_TABLE SET PO_DANGAN_NUMBER = :(SELECT DANGAN_NUMBER FROM EMP_INFO_TABLE WHERE PO_XM IN (SELECT XM FROM EMP_INFO_TABLE) AND PO_SFZH IN ((SELECT SFZH FROM EMP_INFO_TABLE)));
     END CASE;
END;
/

解决方案 »

  1.   


    --试试吧:
    create or replace trigger tg_dangan_number
    before insert or update or delete
    on emp_info_table
    for each row
    declare
      pragma autonomous_transaction;
    begin
      if inserting then
         begin 
            select dangan_number into :new.po_dangan_number 
            from emp_info_table  
            where po_xm:=:new.xm  and po_sfzh=:new.sfzh and rownum=1 ;
         exception when no_data_found then
            :new.po_dangan_number:=null;
         end;
         update emp_info_table set po_dangan_number=:new.dangan_number 
         where po_xm:=:new.xm and po_sfzh=:new.sfzh and rownum=1 ; 
      end if;
      if updating then
        begin 
            select dangan_number into :new.po_dangan_number 
            from emp_info_table  
            where po_xm:=:new.xm and po_sfzh=:new.sfzh and rownum=1 ;
        exception when no_data_found then
            :new.po_dangan_number:=null;
        end;
        update emp_info_table set po_dangan_number=:new.dangan_number 
        where po_xm:=:new.xm and po_sfzh=:new.sfzh and rownum=1 ;     update emp_info_table set po_dangan_number=null 
        where po_xm:=:old.xm and po_sfzh=:old.sfzh and rownum=1 ;
      end if;
      if deleting then
         update emp_info_table set po_dangan_number=null 
         where po_xm:=:old.xm  and po_sfzh=:old.sfzh and rownum=1 ; 
      end if;
      commit;
    end;
    /
      

  2.   

    提示:
    8/20    PL/SQL: ORA-00920: 无效的关系运算符
    6/9     PL/SQL: SQL STATEMENT ignored
    13/17   PL/SQL: ORA-00920: 无效的关系运算符
    12/6    PL/SQL: SQL STATEMENT ignored
    19/20   PL/SQL: ORA-00920: 无效的关系运算符
    17/9    PL/SQL: SQL STATEMENT ignored
    24/16   PL/SQL: ORA-00920: 无效的关系运算符
    23/5    PL/SQL: SQL STATEMENT ignored
    27/16   PL/SQL: ORA-00920: 无效的关系运算符
    26/5    PL/SQL: SQL STATEMENT ignored
    31/17   PL/SQL: ORA-00920: 无效的关系运算符
    30/6    PL/SQL: SQL STATEMENT ignored
      

  3.   

    paddy写的差不多了,就是:=用的太多了
    =是用来做比较的,:=是赋值的,有些where后边的:=应该换成=
    还有 select into 最好用变量吧,反正我是习惯定义变量,select into 变量,再用:new:=变量来赋值
      

  4.   


    haha  gelyon好人 赞一个
      

  5.   

    我改写了下,能通过,但是没起作用,另外一点,夫妻2个人信息要求配偶信息都与对方姓名和身份证号对应上菜能认定是夫妻,如果一个职工的配偶信息与另一个职工的个人信息对应上,但是另一个的配偶信息与该职工的个人信息不一样,单方面一致不认定为夫妻。CREATE OR REPLACE TRIGGER tg_dangan_number
    BEFORE INSERT 
    ON EMP_INFO_TABLE
    FOR EACH ROW
    DECLARE
      PRAGMA autonomous_transaction;
    BEGIN
      IF INSERTING THEN
         BEGIN 
            SELECT dangan_number INTO :NEW.po_dangan_number 
            FROM EMP_INFO_TABLE  
            WHERE po_xm=:NEW.xm  AND po_sfzh=:NEW.sfzh AND ROWNUM=1 ;
         EXCEPTION WHEN NO_DATA_FOUND THEN
            :NEW.po_dangan_number:=NULL;
         END;
         UPDATE EMP_INFO_TABLE SET po_dangan_number=:NEW.dangan_number 
         WHERE po_xm=:NEW.xm AND po_sfzh=:NEW.sfzh AND ROWNUM=1 ; 
      END IF;
     IF UPDATING THEN
        BEGIN 
            SELECT dangan_number INTO :NEW.po_dangan_number 
            FROM EMP_INFO_TABLE  
            WHERE po_xm=:NEW.xm AND po_sfzh=:NEW.sfzh AND ROWNUM=1 ;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            :NEW.po_dangan_number:=NULL;
        END;
        UPDATE EMP_INFO_TABLE SET po_dangan_number=:NEW.dangan_number 
        WHERE po_xm=:NEW.xm AND po_sfzh=:NEW.sfzh AND ROWNUM=1 ;     UPDATE EMP_INFO_TABLE SET po_dangan_number=NULL 
        WHERE po_xm=:OLD.xm AND po_sfzh=:OLD.sfzh AND ROWNUM=1 ;
      END IF;
      IF DELETING THEN
         UPDATE EMP_INFO_TABLE SET po_dangan_number=NULL 
         WHERE po_xm=:OLD.xm  AND po_sfzh=:OLD.sfzh AND ROWNUM=1 ; 
      END IF;
      COMMIT;
    END;
    /