2013-11-01 4 views
0

사용자가 값을 입력하기 전에 WARD이라는 테이블에 사용 가능한 침대가 있는지 확인하기 위해 다음과 같은 방아쇠가 있습니다. 오류가 표시되지 않으면 오류가 표시됩니다. 이것이 내가 다음과 같은 오류 얻을 실행오라클 방아쇠 삽입 전의 if 문의

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'

WARD가 여기에 WARDNUM

라는 INPATIENT_STAY에서 외래 키에 의해 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에서 COLUMN_NAME에서 실수 있습니다. 이름은 WARDNUM 대신 WADNUM입니다. 표의 열 이름을 바꾸거나 트리거에서 변경하십시오.

나는 내 대답을 column_name WADNUM으로 업데이트했습니다.

WHERE wardnum=:NEW.wadnum; 

테이블 INPATIENT_STAT에 삽입 또는 그 갱신을 제한하려면, 당신은 같은이 여전히 작동하지

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

를 응용 프로그램 오류를 발생시킬 수 있습니다, 당신이 확실히 열'WARDNUM 있습니까 동일한 오류 – Pindo

+0

을 제공합니다 'WARD' 및'INPATIENT_STAY' 테이블에 있습니까? – Dba

+0

또는 큰 따옴표없이 열이 생성되었는지 확인하십시오. 'WARD'와'INPATIEND_STAY'에 대한 완전한 create table 스크립트를 공유하십시오. – Dba