Oracle PL/SQL中能否为自定义类型属性设置取值约束?
在Oracle对象类型中限制属性取值的方案
你无法直接在Oracle的自定义对象类型属性上添加类似表字段的CHECK约束,但可以通过以下几种方式实现需求:
1. 使用自定义子类型(SUBTYPE)
先定义一个带CHECK约束的子类型,再将该子类型作为对象属性的类型:
CREATE OR REPLACE SUBTYPE restricted_attrib3 IS VARCHAR2(30) CHECK (VALUE IN ('val1', 'val2', 'val3')); CREATE TYPE my_type AS OBJECT( attrib1 VARCHAR2(30), attrib2 VARCHAR2(30), attrib3 restricted_attrib3 ); /
当创建该类型的实例或在表中使用该类型时,attrib3的取值会自动受到子类型约束的限制。
2. 自定义构造函数校验
在对象类型中添加构造函数,在构造过程中校验attrib3的取值,不符合则抛出异常:
CREATE OR REPLACE TYPE my_type AS OBJECT( attrib1 VARCHAR2(30), attrib2 VARCHAR2(30), attrib3 VARCHAR2(30), -- 声明自定义构造函数 CONSTRUCTOR FUNCTION my_type( p_attrib1 VARCHAR2, p_attrib2 VARCHAR2, p_attrib3 VARCHAR2 ) RETURN SELF AS RESULT ); / -- 实现类型体中的构造函数 CREATE OR REPLACE TYPE BODY my_type AS CONSTRUCTOR FUNCTION my_type( p_attrib1 VARCHAR2, p_attrib2 VARCHAR2, p_attrib3 VARCHAR2 ) RETURN SELF AS RESULT IS BEGIN SELF.attrib1 := p_attrib1; SELF.attrib2 := p_attrib2; -- 校验attrib3取值 IF p_attrib3 NOT IN ('val1', 'val2', 'val3') THEN RAISE_APPLICATION_ERROR(-20001, 'attrib3只能取val1、val2或val3'); END IF; SELF.attrib3 := p_attrib3; RETURN; END; END; /
这种方式能确保所有通过构造函数创建的对象实例都符合取值要求。
3. 在表层面添加CHECK约束
如果该对象类型仅用于特定表,可以在创建表时针对对象属性添加约束:
CREATE TYPE my_type AS OBJECT( attrib1 VARCHAR2(30), attrib2 VARCHAR2(30), attrib3 VARCHAR2(30) ); / CREATE TABLE my_table ( obj_column my_type, CHECK (obj_column.attrib3 IN ('val1', 'val2', 'val3')) ); /
注意:这种约束仅作用于当前表,若该对象类型被用于其他表,需要重复添加约束。
内容的提问来源于stack exchange,提问作者Nevidal
相关产品推荐
相关产品推荐

