SQL - 使用对象的成员函数添加约束检查
SQL - Add constraint check using object's member function
我正在使用 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;
/
它也编译并且工作正常,然后我得到我的 table:
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() 函数以查看它是否 returns 值 1(真)。我尝试了各种替代方法,例如将 property_object
值替换为 self
、将其留空等,但我收到错误消息。以上是错误:
Error report -
SQL Error: ORA-00904: "PROPERTY_OBJECT"."DATE_OF_REGISTRATION_IS_VALID": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
那么如何使用成员函数作为 CHECK CONSTRAINT?
从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;
/
然后没有成员函数检查约束(或嵌套 table,因为我的简化类型没有),并且没有显式空检查 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 "Whosebug.PROPERTY_TYPE", line 7
根据数据,您可能希望根据 trunc(sysdate)
进行验证,因此它是从今天早上午夜开始的,而不是当前时间。
我正在使用 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;
/
它也编译并且工作正常,然后我得到我的 table:
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() 函数以查看它是否 returns 值 1(真)。我尝试了各种替代方法,例如将 property_object
值替换为 self
、将其留空等,但我收到错误消息。以上是错误:
Error report -
SQL Error: ORA-00904: "PROPERTY_OBJECT"."DATE_OF_REGISTRATION_IS_VALID": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
那么如何使用成员函数作为 CHECK CONSTRAINT?
从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;
/
然后没有成员函数检查约束(或嵌套 table,因为我的简化类型没有),并且没有显式空检查 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 "Whosebug.PROPERTY_TYPE", line 7
根据数据,您可能希望根据 trunc(sysdate)
进行验证,因此它是从今天早上午夜开始的,而不是当前时间。