SQL - 使用对象的成员函数添加约束检查

时间:2015-02-18 14:01:01

标签: sql oracle check-constraints

我正在使用Oracle 11g创建我的SQL查询。

到目前为止,我有一个对象:

CREATE OR REPLACE TYPE property_type AS OBJECT (
    propertyNo                NUMBER,
    dateOfRegistration        DATE, [etc..]

  MEMBER FUNCTION       date_of_registration_is_valid RETURN NUMBER
);
/

哪个编译没有问题并且有正文:

CREATE OR REPLACE TYPE BODY property_type AS
  MEMBER FUNCTION date_of_registration_is_valid RETURN NUMBER IS
    is_valid        NUMBER;
    BEGIN
      IF (self.dateOfRegistration < SYSDATE) THEN
        is_valid := 1;
      ELSE
        is_valid := 0;
      END IF;

    RETURN is_valid;
  END;
END;
/

哪个也编译并正常工作,然后我到达我的桌子:

CREATE TABLE property_table OF property_type (
  PRIMARY KEY           (propertyNo),
  CONSTRAINT            property_not_null
  CHECK                 (propertyNo IS NOT NULL),
  CONSTRAINT            property_reg_is_valid
  CHECK                 (property_object.date_of_registration_is_valid() = 1)
) NESTED TABLE relates_to STORE AS relates_to_table;
/

我希望检查date_of_registration_is_valid()函数以查看它是否返回值1(true)。我尝试了各种替代方法,例如替换property_object的{​​{1}}值,留空等等,但是我收到了错误。对于上面的错误:

self

那么如何将成员函数用作CHECK CONSTRAINT?

1 个答案:

答案 0 :(得分:1)

the documentation开始,检查约束不能调用用户定义的函数,这些函数可能包含成员函数。

您可以使用引发异常的构造函数获得类似的行为:

CREATE OR REPLACE TYPE property_type AS OBJECT (
    propertyNo                NUMBER,
    dateOfRegistration        DATE,
    -- [etc ]
    CONSTRUCTOR FUNCTION property_type (SELF IN OUT NOCOPY property_type,
        propertyNo NUMBER, dateOfRegistration DATE /* [etc] */ )
    RETURN SELF AS RESULT
);
/

CREATE OR REPLACE TYPE BODY property_type AS
    CONSTRUCTOR FUNCTION property_type (SELF IN OUT NOCOPY property_type,
        propertyNo NUMBER, dateOfRegistration DATE /* [etc */ )
    RETURN SELF AS RESULT IS
    BEGIN
        IF dateOfRegistration < SYSDATE THEN
            RAISE_APPLICATION_ERROR(-20001, 'Registration date before today');
        END IF;
        SELF.propertyNo := propertyNo;
        SELF.dateOfRegistration := dateOfRegistration;
        RETURN;
    END;
END;
/

然后没有成员函数检查约束(或嵌套表作为我的简化类型没有),并且没有显式空检查ans,同一列上的主键意味着无论如何:

CREATE TABLE property_table OF property_type (
  PRIMARY KEY           (propertyNo)
);
/

Table property_table created.

一些试用插页:

insert into property_table values (property_type(1, sysdate));

1 rows inserted.

insert into property_table values (property_type(2, sysdate - 1));

Error starting at line : 32 in command -
insert into property_table values (property_type(2, sysdate - 1))
Error report -
SQL Error: ORA-20001: Registration date before today
ORA-06512: at "STACKOVERFLOW.PROPERTY_TYPE", line 7

根据数据的不同,您可能希望验证针对trunc(sysdate),因此它是从今天上午午夜开始,而不是当前时间。