0

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

1 回答 1

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)。这种语法不正确,而且我真的看不到直接获取您尝试引用的数据的方法。在这种情况下,我认为触发器(可能在插入或更新之前)可能有助于确定是否满足此条件。在此触发器中,您需要执行 SELECT 以获取 LOCO_CLASS 的 MAX_TOW_WEIGHT,然后将该重量与 TRAIN_WEIGHT 进行比较。如果比较失败(即 TRAIN_WEIGHT > MAX_TOW_WEIGHT),则代码将需要引发用户定义的异常,需要编写执行 INSERT 或 UPDATE 的代码来处理该异常。

分享和享受。

于 2013-03-26T11:04:32.273 回答