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)、次に2番目のテーブルの列(MAX_TOW_WEIGHT)を参照することを意図しているように見えます。この構文は正しくなく、参照しようとしているデータを直接取得する方法は実際にはありません。この場合、トリガー(おそらくINSERTまたはUPDATEの前)がこの条件が満たされているかどうかを判断するのに役立つと思います。このトリガーでは、SELECTを実行してLOCO_CLASSのMAX_TOW_WEIGHTを取得し、その重みをTRAIN_WEIGHTと比較します。比較が失敗した場合(つまり、TRAIN_WEIGHT> MAX_TOW_WEIGHT)、コードはユーザー定義の例外をスローする必要があります。この例外を処理するには、INSERTまたはUPDATEを実行したコードを記述する必要があります。

共有してお楽しみください。

于 2013-03-26T11:04:32.273 に答える