将约束添加到PLSQL中表中的Varray UDT



我一直在弄清楚如何在我的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_GIORNALIEROVARRAY(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_ORETURNO 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) ) );

最新更新