我一直在弄清楚如何在我的udts的属性中添加一些约束。
这是我的情况。我有一个UDT代表员工应该工作的每日小时数(请原谅我使用意大利名称)。
CREATE OR REPLACE TYPE TURNO_GIORNALIERO AS OBJECT(
GIORNO VARCHAR(15),
ORA_INIZIO DATE,
NUMERO_ORE NUMBER,
MEMBER FUNCTION getOreLavoro RETURN NUMBER
);
然后,我将新类型定义为TURNO_GIORNALIERO
的VARRAY(5)
,命名为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。
有人可以帮我吗?我尝试了几种解决方案,但没有任何效用。
我怀疑在check
约束中是否有可能。文档说:
检查约束条件不能包含以下内容 构造:
- 调用用户定义的功能
- 嵌套表列或属性
但是,您可以使用触发器。测试类型和表:
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) ) );