【问题标题】:Oracle trigger before insert if statement插入 if 语句之前的 Oracle 触发器
【发布时间】:2013-11-01 15:43:57
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: sql oracle if-statement triggers


    【解决方案1】:

    您需要将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.')
    

    【讨论】:

    • 您确定WARDNUM 列在表WARDINPATIENT_STAY 中吗?
    • 或者请确认您的列是在没有双引号的情况下创建的。请分享您为WARDINPATIEND_STAY 创建表的完整脚本。
    • 触发器编译正常,但如果bedsavail 为0,我仍然可以插入数据。如何防止这种情况发生?
    • 你的意思是你需要限制表INPATIENT_STAY的插入,如果ward.bedsavail &lt;= 0?
    • @Pindo,要限制插入,您可以引发应用程序错误而不是 DBMS_OUTPUT。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多