【问题标题】:Adding Constraints to VARRAY UDT inside a Table in PLSQL在 PLSQL 中的表内向 VARRAY UDT 添加约束
【发布时间】:2017-12-05 13:08:16
【问题描述】:

我一直在想如何为我的 UDT 的属性添加一些约束。

这是我的情况。我有一个 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。

有人可以帮我吗?我尝试了几种解决方案,但都没有奏效。

【问题讨论】:

    标签: sql oracle


    【解决方案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) ) );
    

    【讨论】:

    • 谢谢@Ponder Stibbons,这非常有效。我认为我应该使用触发器,但想询问是否有更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2017-09-04
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多