2013-11-01 78 views
0

在用戶嘗試輸入值之前,我有如下觸發器來檢查在表中是否有可用的牀,如果不是,則會顯示錯誤。在插入if語句之前的Oracle觸發器

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; 
時,這是運行出現以下錯誤

Error(2,42): PLS-00049: bad bind variable 'NEW.WARDNUM'

WARDINPATIENT_STAY外鍵稱爲WARDNUM

這裏掛INPATIENT_STAY是在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 
) 
); 

的結構如何解決這個問題?

回答

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的列名是錯誤的。名稱是WADNUM而不是WARDNUM。請重命名錶格中的列名稱或在觸發器中進行更改。

我已經更新了我的答案,列名爲WADNUM

WHERE wardnum=:NEW.wadnum; 

來限制表INPATIENT_STAT插入或更新用,可以提高應用程序錯誤一樣,

raise_application_error(-20001, 'There are no beds available.') 
+0

這仍然不能正常工作,它給了同樣的錯誤 – Pindo

+0

你肯定列'WARDNUM 'WARD'&'INPATIENT_STAY'中有沒有? – Dba

+0

或者請驗證您的列是否使用雙引號創建。請分享您完整的'WARD'和'INPATIEND_STAY'創建表格腳本。 – Dba