PL / SQL - 从另一个表调用属性 - 未定义的操作

时间:2013-03-26 10:38:24

标签: sql oracle plsql

我正在尝试执行以下查询。我认为应该可行,但我似乎没有运行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;

1 个答案:

答案 0 :(得分:1)

CHECK约束只能引用定义它们的表中的列。内联CHECK约束进一步限于仅引用定义约束的列,而行外CHECK约束可引用正在定义的表中的多个列。禁止所有CHECK约束包含以下任何内容:

  • 子查询和标量子查询表达式

  • 调用非确定性函数(CURRENT_DATE,CURRENT_TIMESTAMP,DBTIMEZONE,LOCALTIMESTAMP,SESSIONTIMEZONE,SYSDATE,SYSTIMESTAMP,UID,USER和USERENV)

  • 调用用户定义的函数

  • 取消引用REF列(例如,使用DEREF函数)

  • 嵌套表格列或属性

  • 伪列CURRVAL,NEXTVAL,LEVEL或ROWNUM

  • 未完全指定的日期常量

Reference here

在我看来,你的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的代码需要写入来处理。

分享并享受。