定义和声明子类型

子类型作为一个数据类型的子集,可以在任意包或者PL/SQL块中进行定义。

子类型的基类型可以是自定义类型,也可以是基本类型。

子类型可以指定not null约束和range约束,变量引用子类型时如果子类型指定了not null约束那么变量必须指定默认值。

语法:

sub_type_definition ::=

constraint ::=

说明:

sub_type_definition

sub_type_name:即将定义的子类型名称。

base_type_name:子类型依赖的基类型名称。

constraint:对子类型的约束,可缺省。

character_set:指定的字符集

NOT NULL:约束所定义的子类型非空,默认为false

constraint

precision:基类型精度。

scale:基类型范围。

low_value:约束所定义的子类型取值范围的最小值,只有整型可以指定该约束。

high_value:约束所定义的子类型取值范围的最大值,只有整型可以指定该约束。

示例:定义和声明子类型

-- 基类型为基本类型(int),无约束
DECLARE
    SUBTYPE My_Subtype1 IS int;
    a1 My_Subtype1;
BEGIN
    a1 :=123;
    DBMS_OUTPUT.PUT_LINE(a1);
END;
/

-- 基类型为基本类型(number),指定精度和范围
DECLARE
    SUBTYPE My_Subtype1 IS number(4,1);
    a1 My_Subtype1;
BEGIN
    a1 :=123.4;
    DBMS_OUTPUT.PUT_LINE(a1);
END;
/

-- 基类型为基本类型(char),指定not null约束
DECLARE
    SUBTYPE My_Subtype1 IS char(4) NOT NULL;
    a1 My_Subtype1;
BEGIN
    a1 :='abc';
    DBMS_OUTPUT.PUT_LINE(a1);
END;
ERROR, SUBTYPE 声明为 NOT NULL 的变量必须有初始化赋值
     #1: at Program  line 2 (a1 My_Subtype1;)

/


DECLARE
    SUBTYPE My_Subtype1 IS char(4) NOT NULL;
    a1 My_Subtype1 DEFAULT 'def';
BEGIN
    DBMS_OUTPUT.PUT_LINE(a1);
    a1 :='abc';
    DBMS_OUTPUT.PUT_LINE(a1);
END;
/

-- 基类型为基本类型(varchar),指定字符集
DECLARE
    SUBTYPE My_Subtype1 IS varchar CHARACTER SET SQL_TEXT;
    a1 My_Subtype1;
BEGIN
    a1 :='abc';
    DBMS_OUTPUT.PUT_LINE(a1);
END;
/

-- 基类型为基本类型(int),指定range范围
DECLARE
    SUBTYPE My_Subtype1 IS int RANGE 1..10;
    a1 My_Subtype1;
BEGIN
    a1 :=1;
    DBMS_OUTPUT.PUT_LINE(a1);
END;
/

-- 基类型可以为用户自定义类型
DECLARE
    TYPE rec1 is record(c1 int);
    SUBTYPE My_Subtype1 IS rec1;
    a1 My_Subtype1;
BEGIN
    a1.c1 := 1;
    DBMS_OUTPUT.PUT_LINE(a1.c1);
    a1.c1 := 2;
    DBMS_OUTPUT.PUT_LINE(a1.c1);
END;
/