在PLSQL

时间:2017-12-05 13:08:16

标签: sql oracle

我很难搞清楚如何为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。

有人可以帮帮我吗?我尝试了几种解决方案但没有任何效果。

1 个答案:

答案 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) ) );