所以我處理的一種情況可以描述為:
基本上,我有兩種型別的car和supercar
CREATE OR REPLACE TYPE CAR_T AS OBJECT (
id VARCHAR (10),
fuel_type VARCHAR (10)
) NOT FINAL;
CREATE OR REPLACE TYPE SUPERCAR_T UNDER CAR_T (
number_cylinders number(10)
);
將超級跑車插入汽車時:
INSERT INTO CAR VALUES(SUPERCAR_T(99, 'petrol', 12));
我想在插入 CAR 表而不為 SUPERCARS 創建表之前檢查氣缸數是否大于 6:
CREATE OR REPLACE TRIGGER INSERT_SUPERCAR
BEFORE INSERT ON CAR
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
IF :NEW.number_cylinders < 6 THEN
RAISE_APPLICATION_ERROR(-20001,'Not a supercar');
END;
我總是以以下錯誤告終:
bad bind variable 'NEW.number_cylinders'
看來我無法直接訪問子型別的屬性。我的問題是如何修復這樣的錯誤,有沒有更好的方法來使用檢查約束而不為超級跑車創建新表?
uj5u.com熱心網友回復:
您可以使用:NEW.OBJECT_VALUE偽列和TREAT函式將物件轉換為SUPERCAR_T型別,然后檢查number_cylinders屬性:
CREATE OR REPLACE TRIGGER INSERT_SUPERCAR
BEFORE INSERT ON CAR
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
IF :NEW.OBJECT_VALUE IS OF (SUPERCAR_T)
AND TREAT(:NEW.OBJECT_VALUE AS SUPERCAR_T).number_cylinders < 6
THEN
RAISE_APPLICATION_ERROR(-20001,'Not a supercar');
END IF;
END;
/
然后:
INSERT INTO CAR VALUES(SUPERCAR_T(99, 'petrol', 12));
有效但:
INSERT INTO CAR VALUES(SUPERCAR_T(99, 'petrol', 4));
引發例外:
ORA-20001: Not a supercar
您還可以使用CHECK約束:
ALTER TABLE car ADD CONSTRAINT car__supercar_cylinders__chk CHECK (
OBJECT_VALUE IS NOT OF (SUPERCAR_T)
OR TREAT(OBJECT_VALUE AS SUPERCAR_T).number_cylinders >= 6
);
或者
ALTER TABLE car ADD CONSTRAINT car__supercar_cylinders2__chk CHECK (
TREAT(OBJECT_VALUE AS SUPERCAR_T).number_cylinders IS NULL
OR TREAT(OBJECT_VALUE AS SUPERCAR_T).number_cylinders >= 6
);
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461924.html
下一篇:oracle-合并多個列值
