答案ACEGH,本期无人参与。
A:
变量和列数据类型进行了锚定,所以它就是NUMBER(3, 0), 可以包含42, 没任何问题。
B:
变量和列数据类型进行了锚定,所以它就是NUMBER(3, 0), 这不能包含4200, 所以会报错:
ORA-06502: PL/SQL: numeric or value error: number precision too large.
C:
我们定义了一个子类型为NUMBER(3, 0), 可以包含42, 没任何问题。
D:
但是定义的smallint子类型不能包含4200,所以会报错:
ORA-06502: PL/SQL: numeric or value error: number precision too large.
E:
子类型可以用列锚定类型来定义,列上的约束被继承,所以SMALLINT就是NUMBER(3, 0), 可以轻易地包含42。
F:
如同前面所见,既然约束从表的列被继承到子类型,SMALLINT无法包含4200,会报错:
ORA-06502: PL/SQL: numeric or value error: number precision too large.
G:
我们可以通过定义一个新的子类型MEDIUMINT,指定更大的精度,从而覆盖子类型上的精度和宽度约束,
H:
利用这个覆盖了精度的子类型MEDIUMINT我们可以存储值4200,不会报错。
I:
在前两个选项中,我们创建了子类型MEDIUMINT,覆盖了子类型SMALLINT上的精度宽度约束,这是没问题的。但是我们不能直接覆盖用%TYPE的列锚定类型上的约束,这是非法的,会报错:
PLS-00573: cannot constrain scale, precision, or range of an anchored type declaration
J:
因为这是一个编译错误,本选项和前一选项都报同样的错:
(PLS-00573: cannot constrain scale, precision, or range of an anchored type declaration)
我们试图赋予什么值都无关紧要,因为我们永远执行不到赋值语句。 |