1

我有以下触发器来检查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_STAYWARDNUM

这是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 
  )
);

我该如何解决这个问题?

4

1 回答 1

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;
/

编辑:

中的 column_name 有错误INPATIENT_STAY。名称WADNUM代替WARDNUM. 请重命名表中的列名或在触发器中进行更改。

我已经用 column_name 更新了我的答案WADNUM

WHERE  wardnum=:NEW.wadnum;

要限制 table 上的插入或更新INPATIENT_STAT,您可以引发应用程序错误,例如,

raise_application_error( -20001, 'There are no beds available.')
于 2013-11-01T02:39:08.393 回答