触发器中的ORACLE SQL UPDATE语句在两行之后不工作
首先,我使用的是Oracle SQL Developer。 在这个触发器中,我使用了三个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
为什么要使用
update
而不是直接分配?您无法更新尚未插入的行,因此您最后输入的行将始终不正确,并且您将无故更新表中的所有其他行
总体而言,您的代码和数据模型似乎存在许多重大问题:
NEW.BILL\u NO:=NVL(:NEW.BILL\u NO,BILL\u NO_SEQ.NEXTVAL);
起作用时,您正在使用选择进入
将D_名称选择为:医生D的新D_名称,患者P,其中D.D_ID=P.D_ID,P.P_ID=:NEW.P_ID;
)更新
修改同一个表中的所有行
调用触发器,实际插入的行除外你能显示表中的一些示例数据吗?我已经上传了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;
/