我正在尝试执行以下查询。我认为应该可行,但我似乎没有运行CREATE Statement
原因是这条逻辑Loco_No.Loco_Class_No.Max_Tow_Weight
,我不确定它在PL / SQL中有效。
CREATE TABLE Train
(Train_No integer PRIMARY KEY,
Loco_No integer
REFERENCES Locomotive(Loco_No),
Back_Loco_No float
REFERENCES Locomotive(Loco_No),
Train_Length float
CONSTRAINT Train_Len
CHECK(Train_Length <= 400),
Train_Weight float
CONSTRAINT Train_Weight
CHECK(Train_Weight <= Loco_No.Loco_Class_No.Max_Tow_Weight)));
我无法像这样打电话给Max_Tow_Weight
吗?
我的其他参考表
CREATE TABLE Locomotive
(Loco_No integer PRIMARY KEY,
Serial_No integer UNIQUE,
Loco_Class_No integer
REFERENCES Locomotive_Class(Loco_Class_No),
Loco_name varchar2(20));
CREATE TABLE Locomotive_Class
(Loco_Class_No integer PRIMARY KEY,
Max_Tow_Weight float NOT NULL,
Loco_Class_Len float NOT NULL);
更新
CREATE TRIGGER LOCOWEIGHT
BEFORE INSERT
ON Locomotive_Class
REFERENCING NEW AS New
FOR EACH ROW
BEGIN
SELECT Train_Weight FROM locomotive
IF (Train_Weight < MAX_TOW_WEIGHT) THEN
RAISE cError;
EXCEPTION
WHEN cError THEN
RAISE_APPLICATION_EXCEPTION('Train weight has exceeded max tow weight');
END;
答案 0 :(得分:1)
CHECK约束只能引用定义它们的表中的列。内联CHECK约束进一步限于仅引用定义约束的列,而行外CHECK约束可引用正在定义的表中的多个列。禁止所有CHECK约束包含以下任何内容:
子查询和标量子查询表达式
调用非确定性函数(CURRENT_DATE,CURRENT_TIMESTAMP,DBTIMEZONE,LOCALTIMESTAMP,SESSIONTIMEZONE,SYSDATE,SYSTIMESTAMP,UID,USER和USERENV)
调用用户定义的函数
取消引用REF列(例如,使用DEREF函数)
嵌套表格列或属性
伪列CURRVAL,NEXTVAL,LEVEL或ROWNUM
未完全指定的日期常量
在我看来,你的LOCO.LOCO_CLASS.MAX_TOW_WEIGHT构造是指一个表(LOCO),然后是另一个表(LOCO_CLASS),然后是第二个表的一列(MAX_TOW_WEIGHT)。这种语法不正确,我真的找不到直接获取您尝试引用的数据的方法。在这种情况下,我认为触发器(可能是BEFORE INSERT或UPDATE)可能有助于确定是否满足此条件。在此触发器中,您需要执行SELECT以获取LOCO_CLASS的MAX_TOW_WEIGHT,然后将该权重与TRAIN_WEIGHT进行比较。如果比较失败(即TRAIN_WEIGHT&gt; MAX_TOW_WEIGHT),代码将需要抛出一个用户定义的异常,执行INSERT或UPDATE的代码需要写入来处理。
分享并享受。