插入if语句之前的Oracle触发器

时间:2013-11-01 02:19:31

标签: sql oracle if-statement triggers

在用户尝试输入值之前,我有以下触发器来检查名为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

如何解决此问题?

1 个答案:

答案 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.')