[英]Oracle trigger before insert if statement
我有以下觸發器來檢查在用戶嘗試輸入值之前是否在名為WARD
的表中有可用的床,如果沒有則會顯示錯誤。
create or replace
trigger checkBeds
before insert or update on INPATIENT_STAY for
each row
Begin
select BEDSAVAIL from WARD where wardnum=:new.WARDNUM;
if(BEDSAVAIL <=0) then
DBMS_OUTPUT.PUT_LINE('There are no beds available.');
end if;
END;
運行時,我收到以下錯誤:
錯誤(2,42):PLS-00049:錯誤的綁定變量'NEW.WARDNUM'
WARD
鏈接到INPATIENT_STAY
由外鍵INPATIENT_STAY
稱為WARDNUM
這是WARD
表的結構
CREATE TABLE WARD
(
WARDNUM VARCHAR2(20 BYTE) NOT NULL
, NAME VARCHAR2(40 BYTE)
, LOCATION VARCHAR2(20 BYTE)
, TOTALBEDS NUMBER
, TELEXTENTION VARCHAR2(20 BYTE)
, BEDSAVAIL NUMBER
, CONSTRAINT WARD_PK PRIMARY KEY
(
WARDNUM
));
這是INPATIENT_STAY
表的結構
CREATE TABLE INPATIENT_STAY
(
INPATIENTID VARCHAR2(20 BYTE) NOT NULL
, PATIENTNUMBER VARCHAR2(20 BYTE)
, WADNUM VARCHAR2(20 BYTE)
, DATEONWAITINGLIST DATE
, EXPECTEDDURATION VARCHAR2(20 BYTE)
, EXPECTEDLEAVEDATE DATE
, DATEPLACEDINWARD DATE
, REQWARD VARCHAR2(20 BYTE)
, DATELEFT DATE
, CONSTRAINT INPATIENT_STAY_PK PRIMARY KEY
(
INPATIENTID
)
);
我該如何解決這個問題?
您需要將BEDSAVAIL
的值選擇為局部變量並與之進行比較。
試試這樣,
CREATE OR REPLACE
TRIGGER checkbeds
BEFORE INSERT OR UPDATE ON inpatient_stay
FOR EACH ROW
DECLARE
l_bedsavail ward.bedsavail%TYPE;
BEGIN
SELECT bedsavail
INTO l_bedsavail
FROM ward
WHERE wardnum=:NEW.wadnum;
IF(l_bedsavail <= 0) THEN
raise_application_error( -20001, 'There are no beds available.'); --to restrict the insetion`.
END IF;
END;
/
編輯:
INPATIENT_STAY
中的column_name存在INPATIENT_STAY
。 名稱是WADNUM
而不是WARDNUM
。 請重命名表中的列名稱或在觸發器中進行更改。
我用column_name WADNUM
更新了我的答案。
WHERE wardnum=:NEW.wadnum;
要限制表INPATIENT_STAT
上的插入或更新,您可以引發應用程序錯誤,如,
raise_application_error( -20001, 'There are no beds available.')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.