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;
/
职工档案编号 配偶档案编号 职工姓名 职工身份证 配偶姓名 配偶身份证号
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;
/
--试试吧:
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;
/
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
=是用来做比较的,:=是赋值的,有些where后边的:=应该换成=
还有 select into 最好用变量吧,反正我是习惯定义变量,select into 变量,再用:new:=变量来赋值
haha gelyon好人 赞一个
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;
/