我有两个表FORM_A, FORM_B
FORM_A(ID,ID_OTHER,NAME,......)
FORM_B(ID,NAME,.....)
现在的要求是这样的,当我在FORM_A中插入一条记录记录时,
(1)如果ID_OTHER为空,则
在FORM_B中建一条记录,FORM_B中的ID可递增取得,NAME为FORM_A中新插入记录的NAME,然后将FORM_A中新插入记录的ID_OTHER设为FORM_B中新建记录的ID
(2)如果ID_OTHER不为空,则
在FORM_B中建一条记录,ID为FORM_A中的ID_OTHER,NAME为FORM_A中的NAME求满足上述要求的触发器的正确写法。
我自己写的,当FORM_A中原有记录大于1条时就出错,请高手指教!
CREATE OR REPLACE TRIGGER FORM_A_INSERT BEFORE INSERT
ON FORM_A
REFERENCING NEW AS new
FOR EACH ROW
DECLARE
n NUMBER;
BEGIN
    SELECT :new.OTHER_ID INTO n FROM FORM_A;
    IF n IS NULL THEN
        SELECT MAX(ID) INTO n FROM FORM_B;
        IF n IS NULL THEN
            n:=1;
        ELSE
            n:=n+1;
        END IF;
        :new.OTHER_ID:=n;
    END IF;
    INSERT INTO FORM_B(ID, NAME) VALUES(n, :new.NAME);        
END;

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER FORM_A_INSERT BEFORE INSERT 
    ON FORM_A 
    FOR EACH ROW
    BEGIN 
        IF :new.OTHER_ID IS NULL THEN 
            SELECT DECODE(MAX(ID),NULL,1,MAX(ID)+1) INTO :new.OTHER_ID FROM FORM_B; 
        END IF; 
        INSERT INTO FORM_B(ID, NAME) VALUES(:new.OTHER_ID, :new.NAME); 
    END;
      

  2.   

    SELECT :new.OTHER_ID INTO n FROM FORM_A; 
    这句有点多余,而且取不到数据,以为此时new.other_id还没有插入到form_a表中