在用户尝试输入值之前,我有以下触发器来检查名为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
的{{1}}中的外键与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
如何解决此问题?
答案 0 :(得分:3)
您需要为局部变量选择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存在错误。名称为WADNUM
,而不是WARDNUM
。请重命名表中的列名称或在触发器中进行更改。
我已使用column_name WADNUM
更新了我的回答。
WHERE wardnum=:NEW.wadnum;
要限制表INPATIENT_STAT
上的插入或更新,您可以引发应用程序错误,例如,
raise_application_error( -20001, 'There are no beds available.')