我很难搞清楚如何为UDT的属性添加一些约束。
这是我的情况。我有一个代表员工应该工作的每日小时数的UDT(原谅我使用意大利名字)。
CREATE OR REPLACE TYPE TURNO_GIORNALIERO AS OBJECT(
GIORNO VARCHAR(15),
ORA_INIZIO DATE,
NUMERO_ORE NUMBER,
MEMBER FUNCTION getOreLavoro RETURN NUMBER
);
然后我将新类型定义为VARRAY(5)
TURNO_GIORNALIERO
,名为TURNI_SETTIMANALI
(这是一个Varray,其中包含员工应该为一周中的每一天工作的小时数)。
CREATE OR REPLACE TYPE TURNI_SETTIMANALI AS VARRAY(5) OF TURNO_GIORNALIERO;
最后,我创建了包含TURNI_SETTIMANALI
的表格。
CREATE TABLE TURNO_LAVORO(
ID_TURNO CHAR(9) PRIMARY KEY,
TURNO TURNI_SETTIMANALI NOT NULL,
);
我想要做的是向表TURNO_LAVORO
添加约束,以检查NUMERO_ORE
(在TURNO GIORNALIERO
中定义)是否大于5。
答案 0 :(得分:1)
我怀疑在check
约束中是否可行。 Documentation说:
检查条件的条件不能包含以下内容 构建体:
- 调用用户定义的函数
- 嵌套表格列或属性
但是你可以使用触发器。测试类型和表:
create or replace type daily_cycle
as object(day varchar(15), hour_start date, hour_count number);
create or replace type week_cycle
as varray(5) of daily_cycle;
create table test(id int, shift week_cycle);
触发:
create or replace trigger hour_check before insert on test for each row
begin
for i in 1..:new.shift.count() loop
if :new.shift(i).hour_count < 5 then
raise_application_error(-20001,'hours less than 5');
end if;
end loop;
end;
首先insert
有效,第二个没有:
insert into test values (1,
week_cycle(daily_cycle('a', date '2017-12-01', 5),
daily_cycle('b', date '2017-12-02', 8) ) );
insert into test values (2,
week_cycle(daily_cycle('a', date '2017-12-03', 3),
daily_cycle('b', date '2017-12-04', 12),
daily_cycle('b', date '2017-12-05', 7) ) );