簡體   English   中英

插入if語句之前的Oracle觸發器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM