触发器中的ORACLE SQL UPDATE语句在两行之后不工作

触发器中的ORACLE SQL UPDATE语句在两行之后不工作,sql,oracle,triggers,Sql,Oracle,Triggers,首先,我使用的是Oracle SQL Developer。 在这个触发器中,我使用了三个update语句……它们在两行之前工作正常,之后。。。。值仅变为空。 有人能帮我吗 为什么要使用update而不是直接分配?您无法更新尚未插入的行,因此您最后输入的行将始终不正确,并且您将无故更新表中的所有其他行 总体而言,您的代码和数据模型似乎存在许多重大问题: 您正在将日期存储为文本 当直接分配(例如,NEW.BILL\u NO:=NVL(:NEW.BILL\u NO,BILL\u NO_SEQ.NEX

首先,我使用的是Oracle SQL Developer。 在这个触发器中,我使用了三个update语句……它们在两行之前工作正常,之后。。。。值仅变为空。

有人能帮我吗


为什么要使用
update
而不是直接分配?您无法更新尚未插入的行,因此您最后输入的行将始终不正确,并且您将无故更新表中的所有其他行

总体而言,您的代码和数据模型似乎存在许多重大问题:

  • 您正在将日期存储为文本
  • 当直接分配(例如,
    NEW.BILL\u NO:=NVL(:NEW.BILL\u NO,BILL\u NO_SEQ.NEXTVAL);
    起作用时,您正在使用
    选择进入
  • 当您应该使用SQL联接来 减少SQL执行的次数(例如,
    将D_名称选择为:医生D的新D_名称,患者P,其中D.D_ID=P.D_ID,P.P_ID=:NEW.P_ID;
  • 您正在使用
    更新
    修改同一个表中的所有行
    调用触发器,实际插入的行除外
  • “截止日期”或“截止字符”筛选器上没有格式验证(如果您实际存储的是日期而不是文本,则不需要格式验证)
  • 当您可以简单地反转时,可以对abs使用不必要的函数调用 两个日期的顺序

  • 你能显示表中的一些示例数据吗?我已经上传了2张图片……请检查。我只是想问……为什么在触发器中使用update语句,第3条记录不可见。请解释代码应该做什么。我没有投反对票。但您可能会惊讶地发现,非工作代码通常不能很好地提供代码意图的上下文和解释。
    CREATE OR REPLACE TRIGGER BILL_TRG
    BEFORE INSERT ON bill
    FOR EACH ROW 
    DECLARE
    d_id VARCHAR2(20);
    doc_id VARCHAR2(20);
    R_ID VARCHAR2(20);
    p_name varchar2(20);
    
    BEGIN
    IF :NEW.BILL_NO IS NULL THEN
         SELECT BILL_NO_SEQ.NEXTVAL INTO :NEW.BILL_NO FROM DUAL;
    END IF;
    IF :NEW.BILL_DATE IS NULL THEN
           UPDATE BILL set BILL_DATE=TO_CHAR(SYSDATE); 
    END IF;
    IF :NEW.p_name IS NULL THEN
         SELECT p_name INTO :NEW.P_NAME FROM PATIENT WHERE P_ID=:NEW.P_ID;
    END IF;
    IF :NEW.P_GENDER IS NULL THEN
         SELECT P_GENDER INTO :NEW.P_GENDER FROM PATIENT WHERE P_ID=:NEW.P_ID;
    END IF;
    IF :NEW.P_ADDRESS IS NULL THEN
         SELECT P_ADDRESS INTO :NEW.P_ADDRESS FROM PATIENT WHERE P_ID=:NEW.P_ID;
    END IF;
    IF :NEW.D_NAME IS NULL THEN
         SELECT D_ID INTO DOC_ID FROM PATIENT WHERE P_ID=:NEW.P_ID;
         SELECT D_NAME INTO :NEW.D_NAME FROM DOCTOR WHERE D_ID = DOC_ID;
    END IF;
    IF :NEW.DATE_ADMISSION IS NULL THEN
         SELECT DATE_ADMISSION INTO :NEW.DATE_ADMISSION FROM PATIENT WHERE P_ID=:NEW.P_ID;
    END IF;
    IF :NEW.days_admitted IS NULL THEN
        UPDATE BILL SET DAYS_ADMITTED=abs(to_date(date_admission)-to_date(date_discharge));
    END IF;
    IF :NEW.room_charges IS NULL THEN
          SELECT room_id INTO R_ID FROM PATIENT WHERE P_ID=:NEW.P_ID;
          SELECT room_charges INTO :NEW.room_charges FROM room WHERE room_id=R_ID;
          UPDATE BILL SET ROOM_CHARGES=ROOM_CHARGES*DAYS_ADMITTED;
    END IF;
    IF :NEW.total_amount IS NULL THEN
        UPDATE BILL SET TOTAL_AMOUNT=ROOM_CHARGES+PATHOLOGY_FEES+D_FEES+MISCELLANEOUS;
    END IF;
    END;
    /